-
Notifications
You must be signed in to change notification settings - Fork 436
Expand file tree
/
Copy pathIssueTracker.cs
More file actions
118 lines (100 loc) · 4.1 KB
/
Copy pathIssueTracker.cs
File metadata and controls
118 lines (100 loc) · 4.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
namespace SourceGit.Commands
{
public class IssueTracker : Command
{
public IssueTracker(string repo, bool isShared)
{
WorkingDirectory = repo;
Context = repo;
if (isShared)
{
var storage = $"{repo}/.issuetracker";
_isStorageFileExists = File.Exists(storage);
_baseArg = $"config -f {storage.Quoted()}";
}
else
{
_isStorageFileExists = true;
_baseArg = "config --local";
}
}
public async Task ReadAllAsync(List<Models.IssueTracker> outs, bool isShared)
{
if (!_isStorageFileExists)
return;
Args = $"{_baseArg} -l";
var rs = await ReadToEndAsync().ConfigureAwait(false);
if (rs.IsSuccess)
{
var lines = rs.StdOut.Split(['\r', '\n'], StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
{
var parts = line.Split('=', 2);
if (parts.Length < 2)
continue;
var key = parts[0];
var value = parts[1];
if (!key.StartsWith("issuetracker.", StringComparison.Ordinal))
continue;
if (key.EndsWith(".regex", StringComparison.Ordinal))
{
var prefixLen = "issuetracker.".Length;
var suffixLen = ".regex".Length;
var ruleName = key.Substring(prefixLen, key.Length - prefixLen - suffixLen);
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(outs, ruleName, isShared).URLTemplate = value;
}
}
}
}
public async Task<bool> AddAsync(Models.IssueTracker rule)
{
Args = $"{_baseArg} issuetracker.{rule.Name.Quoted()}.regex {rule.RegexString.Quoted()}";
var succ = await ExecAsync().ConfigureAwait(false);
if (succ)
{
Args = $"{_baseArg} issuetracker.{rule.Name.Quoted()}.url {rule.URLTemplate.Quoted()}";
return await ExecAsync().ConfigureAwait(false);
}
return false;
}
public async Task<bool> UpdateRegexAsync(Models.IssueTracker rule)
{
Args = $"{_baseArg} issuetracker.{rule.Name.Quoted()}.regex {rule.RegexString.Quoted()}";
return await ExecAsync().ConfigureAwait(false);
}
public async Task<bool> UpdateURLTemplateAsync(Models.IssueTracker rule)
{
Args = $"{_baseArg} issuetracker.{rule.Name.Quoted()}.url {rule.URLTemplate.Quoted()}";
return await ExecAsync().ConfigureAwait(false);
}
public async Task<bool> RemoveAsync(string name)
{
if (!_isStorageFileExists)
return true;
Args = $"{_baseArg} --remove-section issuetracker.{name.Quoted()}";
return await ExecAsync().ConfigureAwait(false);
}
private Models.IssueTracker FindOrAdd(List<Models.IssueTracker> rules, string ruleName, bool isShared)
{
var rule = rules.Find(x => x.Name.Equals(ruleName, StringComparison.Ordinal));
if (rule != null)
return rule;
rule = new Models.IssueTracker() { IsShared = isShared, Name = ruleName };
rules.Add(rule);
return rule;
}
private readonly bool _isStorageFileExists;
private readonly string _baseArg;
}
}