Track B implementation. Depends on Q2 (#31) and Q6 (#36).
Two related changes:
-
Bundle scoping: change ~/.aspire/bundle/<ver>/ to ~/.aspire/bundle/<install-id>/<ver>/ so two installs at the same version don't collide on extraction or reparse-flip. Reparse-point target moves under <install-id>/.
-
Windows atomic flip: ReparsePoint.cs:72-78 uses RemoveIfExists+Move. Replace with MoveFileExW(MOVEFILE_REPLACE_EXISTING) or directory junction transactional swap. From reparse-flip-risk.md.
Plus: tighten TryCleanupStaleVersions to operate within a single install-id, fix the legacy managed/ migration hard-failure path.
Code touched
src/Aspire.Cli/Bundles/BundleService.cs (TryFlipLinks, TryRestoreLinks, TryCleanupStaleVersions, EnsureExtractedAsync)
src/Aspire.Cli/Bundles/ReparsePoint.cs:72-78
Scenarios advanced
S5.1–S5.5, S7.1, S7.2.
Part of: #29
Track B implementation. Depends on Q2 (#31) and Q6 (#36).
Two related changes:
Bundle scoping: change
~/.aspire/bundle/<ver>/to~/.aspire/bundle/<install-id>/<ver>/so two installs at the same version don't collide on extraction or reparse-flip. Reparse-point target moves under<install-id>/.Windows atomic flip:
ReparsePoint.cs:72-78uses RemoveIfExists+Move. Replace withMoveFileExW(MOVEFILE_REPLACE_EXISTING)or directory junction transactional swap. Fromreparse-flip-risk.md.Plus: tighten
TryCleanupStaleVersionsto operate within a single install-id, fix the legacymanaged/migration hard-failure path.Code touched
src/Aspire.Cli/Bundles/BundleService.cs(TryFlipLinks, TryRestoreLinks, TryCleanupStaleVersions, EnsureExtractedAsync)src/Aspire.Cli/Bundles/ReparsePoint.cs:72-78Scenarios advanced
S5.1–S5.5, S7.1, S7.2.
Part of: #29