diff --git a/src/App.JsonCodeGen.cs b/src/App.JsonCodeGen.cs index d60b76515..aec8bbb62 100644 --- a/src/App.JsonCodeGen.cs +++ b/src/App.JsonCodeGen.cs @@ -65,6 +65,7 @@ public override void Write(Utf8JsonWriter writer, DataGridLength value, JsonSeri [JsonSerializable(typeof(Models.ThemeOverrides))] [JsonSerializable(typeof(Models.Version))] [JsonSerializable(typeof(Models.RepositorySettings))] + [JsonSerializable(typeof(Models.IssueTrackerMigrator.IssueTrackerRepositorySettingsVersion202526))] [JsonSerializable(typeof(List))] [JsonSerializable(typeof(ViewModels.Preferences))] internal partial class JsonCodeGen : JsonSerializerContext { } diff --git a/src/Models/IssueTrackerMigrator.cs b/src/Models/IssueTrackerMigrator.cs new file mode 100644 index 000000000..bee7192c8 --- /dev/null +++ b/src/Models/IssueTrackerMigrator.cs @@ -0,0 +1,58 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text.Json; +using Avalonia.Collections; + +namespace SourceGit.Models +{ + public static class IssueTrackerMigrator + { + public static IEnumerable Migrate(string gitDir) + { + var settingsFileVersion202526 = Path.Combine(gitDir, "sourcegit.settings"); + var rules = ReadIssueTrackerSettings202526(settingsFileVersion202526); + + var additionalIssueTrackers = rules.Select(rule => new IssueTracker + { + IsShared = false, + Name = rule.Name, + RegexString = rule.RegexString, + URLTemplate = rule.URLTemplate, + }); + + return additionalIssueTrackers; + } + + private static IEnumerable ReadIssueTrackerSettings202526( + string settingsFileVersion202526 + ) + { + if (!File.Exists(settingsFileVersion202526)) + return []; + + try + { + using var stream = File.OpenRead(settingsFileVersion202526); + var jsonTypeInfo = JsonCodeGen.Default.IssueTrackerRepositorySettingsVersion202526; + var settings = JsonSerializer.Deserialize(stream, jsonTypeInfo); + var rules = settings.IssueTrackerRules; + return rules ?? []; + } + catch + { + return []; + } + } + + public record IssueTrackerRepositorySettingsVersion202526( + AvaloniaList IssueTrackerRules + ); + + public record IssueTrackerRuleVersion202526( + string Name, + string RegexString, + string URLTemplate + ); + } +} diff --git a/src/ViewModels/Repository.cs b/src/ViewModels/Repository.cs index 9ba559ca4..0df6f706c 100644 --- a/src/ViewModels/Repository.cs +++ b/src/ViewModels/Repository.cs @@ -784,6 +784,7 @@ public void RefreshAll() var issuetrackers = new List(); await CreateIssueTrackerCommand(true).ReadAllAsync(issuetrackers, true).ConfigureAwait(false); await CreateIssueTrackerCommand(false).ReadAllAsync(issuetrackers, false).ConfigureAwait(false); + issuetrackers.AddRange(Models.IssueTrackerMigrator.Migrate(_gitDir)); Dispatcher.UIThread.Post(() => { IssueTrackers.Clear();