Skip to content

Commit 03200f2

Browse files
committed
fix: migrate issue trackers of 2025.26
Starting with version 2025.26 (implemented in commits b345bb4 and 9802ac9 for issue #1599) the issue trackers configured in repository settings are stored in a new format, deleting the issue trackers configured before. Since this breaks compatibility, now these issue trackers in the old format used in versions up to 2025.26 are automatically migrated, so they don't get lost. Fixes #1725.
1 parent 1928694 commit 03200f2

File tree

3 files changed

+60
-0
lines changed

3 files changed

+60
-0
lines changed

src/App.JsonCodeGen.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ public override void Write(Utf8JsonWriter writer, DataGridLength value, JsonSeri
6565
[JsonSerializable(typeof(Models.ThemeOverrides))]
6666
[JsonSerializable(typeof(Models.Version))]
6767
[JsonSerializable(typeof(Models.RepositorySettings))]
68+
[JsonSerializable(typeof(Models.IssueTrackerMigrator.IssueTrackerRepositorySettingsVersion202526))]
6869
[JsonSerializable(typeof(List<Models.VisualStudioInstance>))]
6970
[JsonSerializable(typeof(ViewModels.Preferences))]
7071
internal partial class JsonCodeGen : JsonSerializerContext { }

src/Models/IssueTrackerMigrator.cs

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
using System.Collections.Generic;
2+
using System.IO;
3+
using System.Linq;
4+
using System.Text.Json;
5+
using Avalonia.Collections;
6+
7+
namespace SourceGit.Models
8+
{
9+
public static class IssueTrackerMigrator
10+
{
11+
public static IEnumerable<IssueTracker> Migrate(string gitDir)
12+
{
13+
var settingsFileVersion202526 = Path.Combine(gitDir, "sourcegit.settings");
14+
var rules = ReadIssueTrackerSettings202526(settingsFileVersion202526);
15+
16+
var additionalIssueTrackers = rules.Select(rule => new IssueTracker
17+
{
18+
IsShared = false,
19+
Name = rule.Name,
20+
RegexString = rule.RegexString,
21+
URLTemplate = rule.URLTemplate,
22+
});
23+
24+
return additionalIssueTrackers;
25+
}
26+
27+
private static IEnumerable<IssueTrackerRuleVersion202526> ReadIssueTrackerSettings202526(
28+
string settingsFileVersion202526
29+
)
30+
{
31+
if (!File.Exists(settingsFileVersion202526))
32+
return [];
33+
34+
try
35+
{
36+
using var stream = File.OpenRead(settingsFileVersion202526);
37+
var jsonTypeInfo = JsonCodeGen.Default.IssueTrackerRepositorySettingsVersion202526;
38+
var settings = JsonSerializer.Deserialize(stream, jsonTypeInfo);
39+
var rules = settings.IssueTrackerRules;
40+
return rules ?? [];
41+
}
42+
catch
43+
{
44+
return [];
45+
}
46+
}
47+
48+
public record IssueTrackerRepositorySettingsVersion202526(
49+
AvaloniaList<IssueTrackerRuleVersion202526> IssueTrackerRules
50+
);
51+
52+
public record IssueTrackerRuleVersion202526(
53+
string Name,
54+
string RegexString,
55+
string URLTemplate
56+
);
57+
}
58+
}

src/ViewModels/Repository.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -784,6 +784,7 @@ public void RefreshAll()
784784
var issuetrackers = new List<Models.IssueTracker>();
785785
await CreateIssueTrackerCommand(true).ReadAllAsync(issuetrackers, true).ConfigureAwait(false);
786786
await CreateIssueTrackerCommand(false).ReadAllAsync(issuetrackers, false).ConfigureAwait(false);
787+
issuetrackers.AddRange(Models.IssueTrackerMigrator.Migrate(_gitDir));
787788
Dispatcher.UIThread.Post(() =>
788789
{
789790
IssueTrackers.Clear();

0 commit comments

Comments
 (0)