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..8e4d80a0 --- /dev/null +++ b/tools/LinkDotNet.Blog.UpgradeAssistant/MigrationDiscovery.cs @@ -0,0 +1,17 @@ +using LinkDotNet.Blog.UpgradeAssistant.Migrations; + +namespace LinkDotNet.Blog.UpgradeAssistant; + +public static class MigrationDiscovery +{ + public static IReadOnlyList DiscoverAll() + { + 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 ddc075f4..9fab8e7b 100644 --- a/tools/LinkDotNet.Blog.UpgradeAssistant/MigrationManager.cs +++ b/tools/LinkDotNet.Blog.UpgradeAssistant/MigrationManager.cs @@ -1,29 +1,24 @@ using System.Globalization; using System.Text.Json; using System.Text.Json.Nodes; -using LinkDotNet.Blog.UpgradeAssistant.Migrations; 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() + public MigrationManager(IEnumerable migrations) { - _migrations = new List - { - new Migration11To12() - }; - - _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"; } @@ -57,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-{_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) { @@ -107,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) { @@ -143,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; } } 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)