code_style: add CreateIssueTrackerCommand to generate Commands.IssueTracker

Signed-off-by: leo <longshuang@msn.cn>
This commit is contained in:
leo
2025-07-22 21:42:00 +08:00
parent 9802ac963c
commit d8c8765aa3
2 changed files with 24 additions and 30 deletions

View File

@@ -14,18 +14,17 @@ namespace SourceGit.Commands
_storage = storage;
}
public async Task<List<Models.IssueTracker>> ReadAllAsync(bool isShared)
public async Task ReadAllAsync(List<Models.IssueTracker> outs, bool isShared)
{
if (!File.Exists(_storage))
return [];
return;
Args = $"config -f {_storage.Quoted()} -l";
var output = await ReadToEndAsync().ConfigureAwait(false);
var rs = new List<Models.IssueTracker>();
if (output.IsSuccess)
var rs = await ReadToEndAsync().ConfigureAwait(false);
if (rs.IsSuccess)
{
var lines = output.StdOut.Split(['\r', '\n'], StringSplitOptions.RemoveEmptyEntries);
var lines = rs.StdOut.Split(['\r', '\n'], StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
{
var parts = line.Split('=', 2);
@@ -43,19 +42,17 @@ namespace SourceGit.Commands
var prefixLen = "issuetracker.".Length;
var suffixLen = ".regex".Length;
var ruleName = key.Substring(prefixLen, key.Length - prefixLen - suffixLen);
FindOrAdd(rs, ruleName, isShared).RegexString = value;
FindOrAdd(outs, ruleName, isShared).RegexString = value;
}
else if (key.EndsWith(".url", StringComparison.Ordinal))
{
var prefixLen = "issuetracker.".Length;
var suffixLen = ".url".Length;
var ruleName = key.Substring(prefixLen, key.Length - prefixLen - suffixLen);
FindOrAdd(rs, ruleName, isShared).URLTemplate = value;
FindOrAdd(outs, ruleName, isShared).URLTemplate = value;
}
}
}
return rs;
}
public async Task<bool> AddAsync(Models.IssueTracker rule)
@@ -74,6 +71,9 @@ namespace SourceGit.Commands
public async Task<bool> RemoveAsync(Models.IssueTracker rule)
{
if (!File.Exists(_storage))
return true;
Args = $"config -f {_storage.Quoted()} --remove-section issuetracker.{rule.Name.Quoted()}";
return await ExecAsync().ConfigureAwait(false);
}

View File

@@ -693,7 +693,7 @@ namespace SourceGit.ViewModels
URLTemplate = url,
};
var succ = await new Commands.IssueTracker(_fullpath, $"{_gitDir}/sourcegit.issuetracker").AddAsync(rule);
var succ = await CreateIssueTrackerCommand(false).AddAsync(rule);
if (succ)
{
IssueTrackers.Add(rule);
@@ -705,27 +705,15 @@ namespace SourceGit.ViewModels
public async Task RemoveIssueTrackerAsync(Models.IssueTracker rule)
{
var storage = rule.IsShared ? $"{_fullpath}/.issuetracker" : $"{_gitDir}/sourcegit.issuetracker";
var succ = await new Commands.IssueTracker(_fullpath, storage).RemoveAsync(rule);
var succ = await CreateIssueTrackerCommand(rule.IsShared).RemoveAsync(rule);
if (succ)
IssueTrackers.Remove(rule);
}
public async Task ChangeIssueTrackerShareModeAsync(Models.IssueTracker rule)
{
var shared = new Commands.IssueTracker(_fullpath, $"{_fullpath}/.issuetracker");
var local = new Commands.IssueTracker(_fullpath, $"{_gitDir}/sourcegit.issuetracker");
if (rule.IsShared)
{
await local.RemoveAsync(rule);
await shared.AddAsync(rule);
}
else
{
await local.AddAsync(rule);
await shared.RemoveAsync(rule);
}
await CreateIssueTrackerCommand(!rule.IsShared).RemoveAsync(rule);
await CreateIssueTrackerCommand(rule.IsShared).AddAsync(rule);
}
public void RefreshAll()
@@ -740,13 +728,13 @@ namespace SourceGit.ViewModels
Task.Run(async () =>
{
var sharedIssueTrackers = await new Commands.IssueTracker(_fullpath, $"{_fullpath}/.issuetracker").ReadAllAsync(true).ConfigureAwait(false);
var localIssueTrackers = await new Commands.IssueTracker(_fullpath, $"{_gitDir}/sourcegit.issuetracker").ReadAllAsync(false).ConfigureAwait(false);
var issuetrackers = new List<Models.IssueTracker>();
await CreateIssueTrackerCommand(true).ReadAllAsync(issuetrackers, true).ConfigureAwait(false);
await CreateIssueTrackerCommand(false).ReadAllAsync(issuetrackers, false).ConfigureAwait(false);
Dispatcher.UIThread.Post(() =>
{
IssueTrackers.Clear();
IssueTrackers.AddRange(sharedIssueTrackers);
IssueTrackers.AddRange(localIssueTrackers);
IssueTrackers.AddRange(issuetrackers);
});
var config = await new Commands.Config(_fullpath).ReadAllAsync().ConfigureAwait(false);
@@ -2909,6 +2897,12 @@ namespace SourceGit.ViewModels
return null;
}
private Commands.IssueTracker CreateIssueTrackerCommand(bool shared)
{
var storage = shared ? $"{_fullpath}/.issuetracker" : $"{_gitDir}/sourcegit.issuetracker";
return new Commands.IssueTracker(_fullpath, storage);
}
private BranchTreeNode.Builder BuildBranchTree(List<Models.Branch> branches, List<Models.Remote> remotes)
{
var builder = new BranchTreeNode.Builder(_settings.LocalBranchSortMode, _settings.RemoteBranchSortMode);