From 5aaf222a37d0ea2a8b3c2c455d4ae1c0a66e2249 Mon Sep 17 00:00:00 2001 From: Steven Giesel Date: Wed, 11 Mar 2026 19:29:31 +0100 Subject: [PATCH 1/3] feat: Refactor MigrationManager to accept migrations as a parameter --- .../GlobalUsings.cs | 2 ++ .../MigrationManagerTests.cs | 12 ++++++------ .../MigrationDiscovery.cs | 14 ++++++++++++++ .../MigrationManager.cs | 9 ++------- tools/LinkDotNet.Blog.UpgradeAssistant/Program.cs | 2 +- 5 files changed, 25 insertions(+), 14 deletions(-) create mode 100644 tools/LinkDotNet.Blog.UpgradeAssistant/MigrationDiscovery.cs diff --git a/tests/LinkDotNet.Blog.UpgradeAssistant.Tests/GlobalUsings.cs b/tests/LinkDotNet.Blog.UpgradeAssistant.Tests/GlobalUsings.cs index 38ec2ec2..c7e4589f 100644 --- a/tests/LinkDotNet.Blog.UpgradeAssistant.Tests/GlobalUsings.cs +++ b/tests/LinkDotNet.Blog.UpgradeAssistant.Tests/GlobalUsings.cs @@ -1,5 +1,7 @@ global using System; global using System.IO; global using System.Threading.Tasks; +global using LinkDotNet.Blog.UpgradeAssistant; +global using LinkDotNet.Blog.UpgradeAssistant.Migrations; global using Shouldly; global using Xunit; diff --git a/tests/LinkDotNet.Blog.UpgradeAssistant.Tests/MigrationManagerTests.cs b/tests/LinkDotNet.Blog.UpgradeAssistant.Tests/MigrationManagerTests.cs index ea483f18..84b026e5 100644 --- a/tests/LinkDotNet.Blog.UpgradeAssistant.Tests/MigrationManagerTests.cs +++ b/tests/LinkDotNet.Blog.UpgradeAssistant.Tests/MigrationManagerTests.cs @@ -23,7 +23,7 @@ public async Task Should_Migrate_From_11_To_12() } """; await File.WriteAllTextAsync(testFile, json, TestContext.Current.CancellationToken); - var manager = new MigrationManager(); + var manager = new MigrationManager([new Migration11To12()]); var backupDir = Path.Combine(testDirectory, "backups"); // Act @@ -53,7 +53,7 @@ public async Task Should_Not_Modify_Already_Migrated_File() } """; await File.WriteAllTextAsync(testFile, json, TestContext.Current.CancellationToken); - var manager = new MigrationManager(); + var manager = new MigrationManager([new Migration11To12()]); var backupDir = Path.Combine(testDirectory, "backups"); // Act @@ -76,7 +76,7 @@ public async Task Should_Skip_Version_Controlled_Appsettings_Json() } """; await File.WriteAllTextAsync(testFile, json, TestContext.Current.CancellationToken); - var manager = new MigrationManager(); + var manager = new MigrationManager([new Migration11To12()]); var backupDir = Path.Combine(testDirectory, "backups"); // Act @@ -95,7 +95,7 @@ public async Task Should_Handle_Invalid_Json() // Arrange var testFile = Path.Combine(testDirectory, "appsettings.Invalid.json"); await File.WriteAllTextAsync(testFile, "{ invalid json }", TestContext.Current.CancellationToken); - var manager = new MigrationManager(); + var manager = new MigrationManager([new Migration11To12()]); var backupDir = Path.Combine(testDirectory, "backups"); // Act @@ -110,7 +110,7 @@ public async Task Should_Handle_Missing_File() { // Arrange var testFile = Path.Combine(testDirectory, "nonexistent.json"); - var manager = new MigrationManager(); + var manager = new MigrationManager([new Migration11To12()]); var backupDir = Path.Combine(testDirectory, "backups"); // Act @@ -131,7 +131,7 @@ public async Task DryRun_Should_Not_Modify_File() } """; await File.WriteAllTextAsync(testFile, json, TestContext.Current.CancellationToken); - var manager = new MigrationManager(); + var manager = new MigrationManager([new Migration11To12()]); var backupDir = Path.Combine(testDirectory, "backups"); // Act diff --git a/tools/LinkDotNet.Blog.UpgradeAssistant/MigrationDiscovery.cs b/tools/LinkDotNet.Blog.UpgradeAssistant/MigrationDiscovery.cs new file mode 100644 index 00000000..3c830ec1 --- /dev/null +++ b/tools/LinkDotNet.Blog.UpgradeAssistant/MigrationDiscovery.cs @@ -0,0 +1,14 @@ +namespace LinkDotNet.Blog.UpgradeAssistant; + +public static class MigrationDiscovery +{ + public static IReadOnlyList DiscoverAll() + { + return typeof(IMigration).Assembly + .GetTypes() + .Where(t => t is { IsClass: true, IsAbstract: false } + && typeof(IMigration).IsAssignableFrom(t)) + .Select(t => (IMigration)Activator.CreateInstance(t)!) + .ToList(); + } +} diff --git a/tools/LinkDotNet.Blog.UpgradeAssistant/MigrationManager.cs b/tools/LinkDotNet.Blog.UpgradeAssistant/MigrationManager.cs index ddc075f4..b07efbe7 100644 --- a/tools/LinkDotNet.Blog.UpgradeAssistant/MigrationManager.cs +++ b/tools/LinkDotNet.Blog.UpgradeAssistant/MigrationManager.cs @@ -1,7 +1,6 @@ using System.Globalization; using System.Text.Json; using System.Text.Json.Nodes; -using LinkDotNet.Blog.UpgradeAssistant.Migrations; namespace LinkDotNet.Blog.UpgradeAssistant; @@ -10,13 +9,9 @@ public sealed class MigrationManager private readonly List _migrations; private readonly string _currentVersion; - public MigrationManager() + public MigrationManager(IEnumerable migrations) { - _migrations = new List - { - new Migration11To12() - }; - + _migrations = migrations.ToList(); _currentVersion = DetermineCurrentVersionFromMigrations(); } diff --git a/tools/LinkDotNet.Blog.UpgradeAssistant/Program.cs b/tools/LinkDotNet.Blog.UpgradeAssistant/Program.cs index 17ed5801..b6412fec 100644 --- a/tools/LinkDotNet.Blog.UpgradeAssistant/Program.cs +++ b/tools/LinkDotNet.Blog.UpgradeAssistant/Program.cs @@ -33,7 +33,7 @@ static async Task RunWithOptions(CommandLineOptions options) ConsoleOutput.WriteWarning("Running in DRY RUN mode - no changes will be saved."); } - var manager = new MigrationManager(); + var manager = new MigrationManager(MigrationDiscovery.DiscoverAll()); var files = GetAppsettingsFiles(targetPath); if (files.Count == 0) From faf910b21849344e2cdab0fd49b945a144133f3f Mon Sep 17 00:00:00 2001 From: Steven Giesel Date: Wed, 11 Mar 2026 20:40:44 +0100 Subject: [PATCH 2/3] fix: Styling --- .../MigrationManager.cs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tools/LinkDotNet.Blog.UpgradeAssistant/MigrationManager.cs b/tools/LinkDotNet.Blog.UpgradeAssistant/MigrationManager.cs index b07efbe7..6052c43e 100644 --- a/tools/LinkDotNet.Blog.UpgradeAssistant/MigrationManager.cs +++ b/tools/LinkDotNet.Blog.UpgradeAssistant/MigrationManager.cs @@ -6,19 +6,19 @@ namespace LinkDotNet.Blog.UpgradeAssistant; public sealed class MigrationManager { - private readonly List _migrations; - private readonly string _currentVersion; + private readonly List migrations; + private readonly string currentVersion; public MigrationManager(IEnumerable migrations) { - _migrations = migrations.ToList(); - _currentVersion = DetermineCurrentVersionFromMigrations(); + this.migrations = migrations.ToList(); + currentVersion = DetermineCurrentVersionFromMigrations(); } private string DetermineCurrentVersionFromMigrations() { - return _migrations.Count > 0 - ? _migrations.Max(m => m.ToVersion) ?? "11.0" + return migrations.Count > 0 + ? migrations.Max(m => m.ToVersion) ?? "11.0" : "11.0"; } @@ -53,7 +53,7 @@ public async Task MigrateFileAsync(string filePath, bool dryRun, string ba } var currentVersion = GetVersion(document); - ConsoleOutput.WriteInfo($"Current version: {currentVersion ?? $"Not set (pre-{_currentVersion})"}"); + ConsoleOutput.WriteInfo($"Current version: {currentVersion ?? $"Not set (pre-{this.currentVersion})"}"); var applicableMigrations = GetApplicableMigrations(currentVersion); @@ -102,7 +102,7 @@ public async Task MigrateFileAsync(string filePath, bool dryRun, string ba if (hasAnyChanges) { - modifiedContent = SetVersion(modifiedContent, _currentVersion); + modifiedContent = SetVersion(modifiedContent, this.currentVersion); if (!dryRun) { @@ -145,7 +145,7 @@ private List GetApplicableMigrations(string? currentVersion) while (foundMigration) { foundMigration = false; - foreach (var migration in _migrations) + foreach (var migration in migrations) { if (migration.FromVersion == currentMigrationVersion) { From 821f98e3d719b2c2cc6577e34429ad30075f0be9 Mon Sep 17 00:00:00 2001 From: Steven Giesel Date: Wed, 11 Mar 2026 20:45:27 +0100 Subject: [PATCH 3/3] fix: Explicit version --- .../MigrationDiscovery.cs | 13 ++++++---- .../MigrationManager.cs | 24 +++++++------------ 2 files changed, 16 insertions(+), 21 deletions(-) diff --git a/tools/LinkDotNet.Blog.UpgradeAssistant/MigrationDiscovery.cs b/tools/LinkDotNet.Blog.UpgradeAssistant/MigrationDiscovery.cs index 3c830ec1..8e4d80a0 100644 --- a/tools/LinkDotNet.Blog.UpgradeAssistant/MigrationDiscovery.cs +++ b/tools/LinkDotNet.Blog.UpgradeAssistant/MigrationDiscovery.cs @@ -1,14 +1,17 @@ +using LinkDotNet.Blog.UpgradeAssistant.Migrations; + namespace LinkDotNet.Blog.UpgradeAssistant; public static class MigrationDiscovery { public static IReadOnlyList DiscoverAll() { - return typeof(IMigration).Assembly - .GetTypes() - .Where(t => t is { IsClass: true, IsAbstract: false } - && typeof(IMigration).IsAssignableFrom(t)) - .Select(t => (IMigration)Activator.CreateInstance(t)!) + return new IMigration[] + { + new Migration11To12() + } + .OrderBy(m => Version.TryParse(m.FromVersion, out var v) ? v : new Version(0, 0)) + .ThenBy(m => Version.TryParse(m.ToVersion, out var v) ? v : new Version(0, 0)) .ToList(); } } diff --git a/tools/LinkDotNet.Blog.UpgradeAssistant/MigrationManager.cs b/tools/LinkDotNet.Blog.UpgradeAssistant/MigrationManager.cs index 6052c43e..9fab8e7b 100644 --- a/tools/LinkDotNet.Blog.UpgradeAssistant/MigrationManager.cs +++ b/tools/LinkDotNet.Blog.UpgradeAssistant/MigrationManager.cs @@ -52,10 +52,10 @@ public async Task MigrateFileAsync(string filePath, bool dryRun, string ba return false; } - var currentVersion = GetVersion(document); - ConsoleOutput.WriteInfo($"Current version: {currentVersion ?? $"Not set (pre-{this.currentVersion})"}"); + var configVersion = GetVersion(document); + ConsoleOutput.WriteInfo($"Current version: {configVersion ?? $"Not set (pre-{this.currentVersion})"}"); - var applicableMigrations = GetApplicableMigrations(currentVersion); + var applicableMigrations = GetApplicableMigrations(configVersion); if (applicableMigrations.Count == 0) { @@ -138,22 +138,14 @@ private static bool IsVersionControlledAppsettingsFile(string fileName) private List GetApplicableMigrations(string? currentVersion) { var result = new List(); - var startVersion = currentVersion ?? "11.0"; - var currentMigrationVersion = startVersion; - var foundMigration = true; + var currentMigrationVersion = currentVersion ?? "11.0"; - while (foundMigration) + foreach (var migration in migrations) { - foundMigration = false; - foreach (var migration in migrations) + if (migration.FromVersion == currentMigrationVersion) { - if (migration.FromVersion == currentMigrationVersion) - { - result.Add(migration); - currentMigrationVersion = migration.ToVersion; - foundMigration = true; - break; - } + result.Add(migration); + currentMigrationVersion = migration.ToVersion; } }