diff --git a/src/Commands/IssueTracker.cs b/src/Commands/IssueTracker.cs index bb8aae14..8791714c 100644 --- a/src/Commands/IssueTracker.cs +++ b/src/Commands/IssueTracker.cs @@ -14,18 +14,17 @@ namespace SourceGit.Commands _storage = storage; } - public async Task> ReadAllAsync(bool isShared) + public async Task ReadAllAsync(List 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(); - 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 AddAsync(Models.IssueTracker rule) @@ -74,6 +71,9 @@ namespace SourceGit.Commands public async Task 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); } diff --git a/src/ViewModels/Repository.cs b/src/ViewModels/Repository.cs index 594a051b..3f111367 100644 --- a/src/ViewModels/Repository.cs +++ b/src/ViewModels/Repository.cs @@ -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(); + 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 branches, List remotes) { var builder = new BranchTreeNode.Builder(_settings.LocalBranchSortMode, _settings.RemoteBranchSortMode);