Improve fallout-migrate: NuGet-scoped version pin, TFM warning/bump, confirmation prompt, async pipeline - #509
Merged
Conversation
IT-VBFK
reviewed
Jul 18, 2026
ChrisonSimtian
left a comment
Collaborator
There was a problem hiding this comment.
some small things :-)
dennisdoomen
force-pushed
the
migrate-ansiconsole-output
branch
from
July 19, 2026 15:14
38d0437 to
8affb45
Compare
dennisdoomen
marked this pull request as ready for review
July 19, 2026 18:12
ITaluone
approved these changes
Jul 20, 2026
ITaluone
reviewed
Jul 20, 2026
ChrisonSimtian
approved these changes
Jul 20, 2026
ChrisonSimtian
left a comment
Collaborator
There was a problem hiding this comment.
i think i forgot to greentick this last time ... sorry bit forgetful right now :-)
2 tasks
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…ajor ResolveFalloutVersionStep now queries NuGet's flat-container index for the latest non-prerelease Fallout.Common release matching the running tool's own major (calendar year), instead of only reading the tool's own AssemblyInformationalVersion. This keeps a migration pinned to what's actually installable without jumping to a newer, potentially breaking yearly major the tool wasn't built against. Falls back to the tool's own version when NuGet can't be reached or has no matching-major stable release yet, and logs via AnsiConsole which path was taken so the resolved version is never a silent guess. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Fallout's tooling is built and tested against .NET 10; a build project still on an older TFM can hit tool incompatibilities that this migration's other, purely textual rewrites won't catch. VerifyBuildTargetFrameworkStep reads _build.csproj's TargetFramework(s) and adds a warning for any moniker that isn't a modern net10.0+ (catching net8.0, net48, netstandard2.0, netcoreapp3.1, etc.). Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
ConfirmMigrationStep runs immediately before RewriteCsprojsStep, the first step that mutates files, and prompts via AnsiConsole.Confirm before letting the migration proceed. Declining sets the new Summary.Cancelled flag, which Migration.Run checks to stop executing further steps, and MigrateCommand returns exit code 1 without printing the (now meaningless) summary. The prompt is skipped for --dry-run (nothing would be written) and when stdin is redirected (CI, piped input, automated tests) since there's nothing to prompt against. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CsprojRewriter.Rewrite had a single caller (RewriteCsprojsStep). Move its regex fields and Rewrite method directly into the step and delete the now-empty class. Rename the spec file/class to match. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Add BumpDotNetVersionStep: rewrites _build.csproj's TargetFramework and global.json's sdk.version to net10.0 / 10.0.100 during migration, matching the versions Fallout's own tooling targets — but only when what's there is behind those minimums, so an already up-to-date or newer build project is left untouched. Build projects don't multi-target, so only the singular TargetFramework element is matched. The minimum TFM major is parsed from TargetFramework itself rather than duplicated as a separate constant, so there's a single source of truth. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Replace the blocking GetAsync(...).GetAwaiter().GetResult() in ResolveFalloutVersionStep with a proper await. IMigrationStep.Execute is now Task ExecuteAsync; Migration.Run is Migration.RunAsync; MigrateCommand is now an AsyncCommand<MigrateSettings>; Program.Main awaits CommandApp.RunAsync. ConfirmMigrationStep now awaits ConfirmationPrompt.ShowAsync instead of the blocking AnsiConsole.Confirm. Steps with no async work simply return Task.CompletedTask. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Extract the modern-moniker regex and IsOlderThanMinimumSupported logic duplicated between BumpDotNetVersionStep and VerifyBuildTargetFrameworkStep into a shared TargetFrameworkMonikers helper. VerifyBuildTargetFrameworkStep now reads BumpDotNetVersionStep.MinimumSupportedMajor instead of maintaining its own separate constant. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…equests Reorder the private methods to match the order they're invoked from ExecuteAsync (assembly, then major, then NuGet), and add a User-Agent header to the NuGet flat-container HttpClient so requests aren't sent as anonymous script traffic. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
dennisdoomen
force-pushed
the
actual-migration-improvements
branch
from
July 20, 2026 18:09
7872deb to
9d0b642
Compare
Collaborator
Author
|
@ChrisonSimtian As you already approved the PR, I assume your comments were suggestions. If you feel they need addressing, let me know. More than fine creating another PR. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
A set of focused improvements to
fallout-migrate: pin the migratedFallout.Commonreference to the latest NuGet release instead of the running tool's own version, warn and optionally bump an outdated build-project TFM, ask for confirmation before writing files, and convert the migration pipeline to async.Changes
Bump Fallout.Migrate to the 10.x version line — version bump.
Resolve Fallout.Common version from NuGet, scoped to the tool's own major —
ResolveFalloutVersionStepnow queries NuGet's flat-container index for the latest non-prereleaseFallout.Commonrelease matching the running tool's own major (calendar year), instead of only reading the tool's ownAssemblyInformationalVersion. Falls back to the tool's own version when NuGet can't be reached or has no matching-major stable release yet.Warn when the build project targets an older TFM than .NET 10 —
VerifyBuildTargetFrameworkStepreads_build.csproj'sTargetFramework(s)and warns for any moniker older thannet10.0.Ask for confirmation before the migration writes any files —
ConfirmMigrationStepprompts viaAnsiConsole.Confirmimmediately before the first file-mutating step. Declining setsSummary.Cancelledand stops the pipeline. Skipped for--dry-runand when stdin is redirected.Fold CsprojRewriter into RewriteCsprojsStep —
CsprojRewriter.Rewritehad a single caller; merged directly into the step.Bump build project to net10.0 and global.json SDK to 10.0.100 —
BumpDotNetVersionSteprewrites_build.csproj'sTargetFrameworkandglobal.json'ssdk.versionwhen either is behind the minimum, leaving already-current or newer values untouched. Build projects don't multi-target, so only the singularTargetFrameworkelement is matched.Make IMigrationStep and the migration pipeline asynchronous —
IMigrationStep.Executeis nowTask ExecuteAsync; replaces the blockingGetAsync(...).GetAwaiter().GetResult()inResolveFalloutVersionStepwith a properawait.Deduplicate the TFM-minimum check shared by two migration steps — extract the modern-moniker regex and minimum-check logic duplicated between
BumpDotNetVersionStepandVerifyBuildTargetFrameworkStepinto a sharedTargetFrameworkMonikershelper.Reorder ResolveFalloutVersionStep by invocation order and tag NuGet requests — reorder private methods to match invocation order; add a
User-Agentheader to the NuGet flat-containerHttpClientso requests aren't sent as anonymous script traffic.Combined effect
fallout-migratenow pins migrated references to a real, publishedFallout.Commonrelease, flags/fixes an outdated build-project TFM, confirms before mutating files, and runs its pipeline asynchronously.