Skip to content

Commit b345bb4

Browse files
committed
refactor: use the same method to save both local and shared issuetracker (#1599)
Signed-off-by: leo <[email protected]>
1 parent bee4f95 commit b345bb4

15 files changed

+346
-232
lines changed

src/App.axaml.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -446,7 +446,7 @@ private static bool TryLaunchAsRebaseTodoEditor(string[] args, out int exitCode)
446446
if (!dirInfo.Exists || !dirInfo.Name.Equals("rebase-merge", StringComparison.Ordinal))
447447
return true;
448448

449-
var jobsFile = Path.Combine(dirInfo.Parent!.FullName, "sourcegit_rebase_jobs.json");
449+
var jobsFile = Path.Combine(dirInfo.Parent!.FullName, "sourcegit.interactive_rebase");
450450
if (!File.Exists(jobsFile))
451451
return true;
452452

@@ -491,7 +491,7 @@ private static bool TryLaunchAsRebaseMessageEditor(string[] args, out int exitCo
491491
var origHeadFile = Path.Combine(gitDir, "rebase-merge", "orig-head");
492492
var ontoFile = Path.Combine(gitDir, "rebase-merge", "onto");
493493
var doneFile = Path.Combine(gitDir, "rebase-merge", "done");
494-
var jobsFile = Path.Combine(gitDir, "sourcegit_rebase_jobs.json");
494+
var jobsFile = Path.Combine(gitDir, "sourcegit.interactive_rebase");
495495
if (!File.Exists(ontoFile) || !File.Exists(origHeadFile) || !File.Exists(doneFile) || !File.Exists(jobsFile))
496496
return true;
497497

src/Commands/SharedIssueTracker.cs renamed to src/Commands/IssueTracker.cs

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,24 @@
55

66
namespace SourceGit.Commands
77
{
8-
public class SharedIssueTracker : Command
8+
public class IssueTracker : Command
99
{
10-
public SharedIssueTracker(string repo)
10+
public IssueTracker(string repo, string storage)
1111
{
1212
WorkingDirectory = repo;
1313
Context = repo;
14-
_file = $"{repo}/.issuetracker";
14+
_storage = storage;
1515
}
1616

17-
public async Task<List<Models.IssueTrackerRule>> ReadAllAsync()
17+
public async Task<List<Models.IssueTracker>> ReadAllAsync(bool isShared)
1818
{
19-
if (!File.Exists(_file))
19+
if (!File.Exists(_storage))
2020
return [];
2121

22-
Args = $"config -f {_file.Quoted()} -l";
22+
Args = $"config -f {_storage.Quoted()} -l";
2323

2424
var output = await ReadToEndAsync().ConfigureAwait(false);
25-
var rs = new List<Models.IssueTrackerRule>();
25+
var rs = new List<Models.IssueTracker>();
2626
if (output.IsSuccess)
2727
{
2828
var lines = output.StdOut.Split(['\r', '\n'], StringSplitOptions.RemoveEmptyEntries);
@@ -43,52 +43,52 @@ public SharedIssueTracker(string repo)
4343
var prefixLen = "issuetracker.".Length;
4444
var suffixLen = ".regex".Length;
4545
var ruleName = key.Substring(prefixLen, key.Length - prefixLen - suffixLen);
46-
FindOrAdd(rs, ruleName).RegexString = value;
46+
FindOrAdd(rs, ruleName, isShared).RegexString = value;
4747
}
4848
else if (key.EndsWith(".url", StringComparison.Ordinal))
4949
{
5050
var prefixLen = "issuetracker.".Length;
5151
var suffixLen = ".url".Length;
5252
var ruleName = key.Substring(prefixLen, key.Length - prefixLen - suffixLen);
53-
FindOrAdd(rs, ruleName).URLTemplate = value;
53+
FindOrAdd(rs, ruleName, isShared).URLTemplate = value;
5454
}
5555
}
5656
}
5757

5858
return rs;
5959
}
6060

61-
public async Task<bool> AddAsync(Models.IssueTrackerRule rule)
61+
public async Task<bool> AddAsync(Models.IssueTracker rule)
6262
{
63-
Args = $"config -f {_file.Quoted()} issuetracker.{rule.Name.Quoted()}.regex {rule.RegexString.Quoted()}";
63+
Args = $"config -f {_storage.Quoted()} issuetracker.{rule.Name.Quoted()}.regex {rule.RegexString.Quoted()}";
6464

6565
var succ = await ExecAsync().ConfigureAwait(false);
6666
if (succ)
6767
{
68-
Args = $"config -f {_file.Quoted()} issuetracker.{rule.Name.Quoted()}.url {rule.URLTemplate.Quoted()}";
68+
Args = $"config -f {_storage.Quoted()} issuetracker.{rule.Name.Quoted()}.url {rule.URLTemplate.Quoted()}";
6969
return await ExecAsync().ConfigureAwait(false);
7070
}
7171

7272
return false;
7373
}
7474

75-
public async Task<bool> RemoveAsync(Models.IssueTrackerRule rule)
75+
public async Task<bool> RemoveAsync(Models.IssueTracker rule)
7676
{
77-
Args = $"config -f {_file.Quoted()} --remove-section issuetracker.{rule.Name.Quoted()}";
77+
Args = $"config -f {_storage.Quoted()} --remove-section issuetracker.{rule.Name.Quoted()}";
7878
return await ExecAsync().ConfigureAwait(false);
7979
}
8080

81-
private Models.IssueTrackerRule FindOrAdd(List<Models.IssueTrackerRule> rules, string ruleName)
81+
private Models.IssueTracker FindOrAdd(List<Models.IssueTracker> rules, string ruleName, bool isShared)
8282
{
8383
var rule = rules.Find(x => x.Name.Equals(ruleName, StringComparison.Ordinal));
8484
if (rule != null)
8585
return rule;
8686

87-
rule = new Models.IssueTrackerRule() { IsShared = true, Name = ruleName };
87+
rule = new Models.IssueTracker() { IsShared = isShared, Name = ruleName };
8888
rules.Add(rule);
8989
return rule;
9090
}
9191

92-
private readonly string _file;
92+
private readonly string _storage;
9393
}
9494
}

src/Models/IssueTrackerRule.cs renamed to src/Models/IssueTracker.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
using System.Text.RegularExpressions;
2-
32
using CommunityToolkit.Mvvm.ComponentModel;
43

54
namespace SourceGit.Models
65
{
7-
public class IssueTrackerRule : ObservableObject
6+
public class IssueTracker : ObservableObject
87
{
98
public bool IsShared
109
{

src/Models/RepositorySettings.cs

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -128,12 +128,6 @@ public AvaloniaList<string> CommitMessages
128128
set;
129129
} = [];
130130

131-
public AvaloniaList<IssueTrackerRule> IssueTrackerRules
132-
{
133-
get;
134-
set;
135-
} = [];
136-
137131
public AvaloniaList<CustomAction> CustomActions
138132
{
139133
get;
@@ -409,25 +403,6 @@ public void PushCommitMessage(string message)
409403
CommitMessages.Insert(0, message);
410404
}
411405

412-
public IssueTrackerRule AddIssueTracker(string name, string regex, string url)
413-
{
414-
var rule = new IssueTrackerRule()
415-
{
416-
Name = name,
417-
RegexString = regex,
418-
URLTemplate = url,
419-
};
420-
421-
IssueTrackerRules.Add(rule);
422-
return rule;
423-
}
424-
425-
public void RemoveIssueTracker(IssueTrackerRule rule)
426-
{
427-
if (rule != null)
428-
IssueTrackerRules.Remove(rule);
429-
}
430-
431406
public CustomAction AddNewCustomAction()
432407
{
433408
var act = new CustomAction() { Name = "Unnamed Action" };

src/ViewModels/CommitDetail.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -764,7 +764,7 @@ private void Refresh()
764764
private async Task<Models.InlineElementCollector> ParseInlinesInMessageAsync(string message)
765765
{
766766
var inlines = new Models.InlineElementCollector();
767-
if (_repo.Settings.IssueTrackerRules is { Count: > 0 } rules)
767+
if (_repo.IssueTrackers is { Count: > 0 } rules)
768768
{
769769
foreach (var rule in rules)
770770
rule.Matches(inlines, message);

src/ViewModels/InteractiveRebase.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,9 @@ public bool AutoStash
9797
set;
9898
} = true;
9999

100-
public AvaloniaList<Models.IssueTrackerRule> IssueTrackerRules
100+
public AvaloniaList<Models.IssueTracker> IssueTrackers
101101
{
102-
get => _repo.Settings.IssueTrackerRules;
102+
get => _repo.IssueTrackers;
103103
}
104104

105105
public bool IsLoading
@@ -213,7 +213,7 @@ public async Task<bool> Start()
213213
{
214214
_repo.SetWatcherEnabled(false);
215215

216-
var saveFile = Path.Combine(_repo.GitDir, "sourcegit_rebase_jobs.json");
216+
var saveFile = Path.Combine(_repo.GitDir, "sourcegit.interactive_rebase");
217217
var collection = new Models.InteractiveRebaseJobCollection();
218218
collection.OrigHead = _repo.CurrentBranch.Head;
219219
collection.Onto = On.SHA;

src/ViewModels/Repository.cs

Lines changed: 60 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,12 @@ public int CommitDetailActivePageIndex
457457
set;
458458
} = 0;
459459

460+
public AvaloniaList<Models.IssueTracker> IssueTrackers
461+
{
462+
get;
463+
private set;
464+
} = new AvaloniaList<Models.IssueTracker>();
465+
460466
public AvaloniaList<CommandLog> Logs
461467
{
462468
get;
@@ -529,24 +535,17 @@ public void Close()
529535
SelectedView = null; // Do NOT modify. Used to remove exists widgets for GC.Collect
530536
Logs.Clear();
531537

532-
_settings.LastCommitMessage = _workingCopy.CommitMessage;
533-
534-
var sharedIssueTrackers = new List<Models.IssueTrackerRule>();
535-
foreach (var rule in _settings.IssueTrackerRules)
536-
if (rule.IsShared)
537-
sharedIssueTrackers.Add(rule);
538-
539-
_settings.IssueTrackerRules.RemoveAll(sharedIssueTrackers);
540-
541538
try
542539
{
540+
_settings.LastCommitMessage = _workingCopy.CommitMessage;
543541
using var stream = File.Create(Path.Combine(_gitDir, "sourcegit.settings"));
544542
JsonSerializer.Serialize(stream, _settings, JsonCodeGen.Default.RepositorySettings);
545543
}
546544
catch
547545
{
548546
// Ignore
549547
}
548+
550549
_autoFetchTimer.Dispose();
551550
_autoFetchTimer = null;
552551

@@ -684,6 +683,51 @@ public CommandLog CreateLog(string name)
684683
return log;
685684
}
686685

686+
public async Task<Models.IssueTracker> AddIssueTrackerAsync(string name, string regex, string url)
687+
{
688+
var rule = new Models.IssueTracker()
689+
{
690+
IsShared = false,
691+
Name = name,
692+
RegexString = regex,
693+
URLTemplate = url,
694+
};
695+
696+
var succ = await new Commands.IssueTracker(_fullpath, $"{_gitDir}/sourcegit.issuetracker").AddAsync(rule);
697+
if (succ)
698+
{
699+
IssueTrackers.Add(rule);
700+
return rule;
701+
}
702+
703+
return null;
704+
}
705+
706+
public async Task RemoveIssueTrackerAsync(Models.IssueTracker rule)
707+
{
708+
var storage = rule.IsShared ? $"{_fullpath}/.issuetracker" : $"{_gitDir}/sourcegit.issuetracker";
709+
var succ = await new Commands.IssueTracker(_fullpath, storage).RemoveAsync(rule);
710+
if (succ)
711+
IssueTrackers.Remove(rule);
712+
}
713+
714+
public async Task ChangeIssueTrackerShareModeAsync(Models.IssueTracker rule)
715+
{
716+
var shared = new Commands.IssueTracker(_fullpath, $"{_fullpath}/.issuetracker");
717+
var local = new Commands.IssueTracker(_fullpath, $"{_gitDir}/sourcegit.issuetracker");
718+
719+
if (rule.IsShared)
720+
{
721+
await local.RemoveAsync(rule);
722+
await shared.AddAsync(rule);
723+
}
724+
else
725+
{
726+
await local.AddAsync(rule);
727+
await shared.RemoveAsync(rule);
728+
}
729+
}
730+
687731
public void RefreshAll()
688732
{
689733
Task.Run(RefreshCommits);
@@ -696,9 +740,13 @@ public void RefreshAll()
696740

697741
Task.Run(async () =>
698742
{
699-
var sharedIssueTrackers = await new Commands.SharedIssueTracker(_fullpath).ReadAllAsync().ConfigureAwait(false);
700-
if (sharedIssueTrackers.Count > 0)
701-
Dispatcher.UIThread.Post(() => _settings.IssueTrackerRules.InsertRange(0, sharedIssueTrackers));
743+
var sharedIssueTrackers = await new Commands.IssueTracker(_fullpath, $"{_fullpath}/.issuetracker").ReadAllAsync(true).ConfigureAwait(false);
744+
var localIssueTrackers = await new Commands.IssueTracker(_fullpath, $"{_gitDir}/sourcegit.issuetracker").ReadAllAsync(false).ConfigureAwait(false);
745+
Dispatcher.UIThread.Post(() =>
746+
{
747+
IssueTrackers.AddRange(sharedIssueTrackers);
748+
IssueTrackers.AddRange(localIssueTrackers);
749+
});
702750

703751
var config = await new Commands.Config(_fullpath).ReadAllAsync().ConfigureAwait(false);
704752
_hasAllowedSignersFile = config.TryGetValue("gpg.ssh.allowedSignersFile", out var allowedSignersFile) && !string.IsNullOrEmpty(allowedSignersFile);

0 commit comments

Comments
 (0)