1
- using System . Collections . Generic ;
1
+ using System ;
2
+ using System . Collections . Generic ;
2
3
using System . Threading . Tasks ;
3
4
4
5
using Avalonia . Collections ;
@@ -114,8 +115,8 @@ public Models.CommitTemplate SelectedCommitTemplate
114
115
115
116
public AvaloniaList < Models . IssueTracker > IssueTrackers
116
117
{
117
- get => _repo . IssueTrackers ;
118
- }
118
+ get ;
119
+ } = [ ] ;
119
120
120
121
public Models . IssueTracker SelectedIssueTracker
121
122
{
@@ -176,6 +177,17 @@ public RepositoryConfigure(Repository repo)
176
177
HttpProxy = proxy ;
177
178
if ( _cached . TryGetValue ( "fetch.prune" , out var prune ) )
178
179
EnablePruneOnFetch = ( prune == "true" ) ;
180
+
181
+ foreach ( var rule in _repo . IssueTrackers )
182
+ {
183
+ IssueTrackers . Add ( new ( )
184
+ {
185
+ IsShared = rule . IsShared ,
186
+ Name = rule . Name ,
187
+ RegexString = rule . RegexString ,
188
+ URLTemplate = rule . URLTemplate ,
189
+ } ) ;
190
+ }
179
191
}
180
192
181
193
public void ClearHttpProxy ( )
@@ -208,25 +220,28 @@ public List<string> GetRemoteVisitUrls()
208
220
return outs ;
209
221
}
210
222
211
- public async Task AddIssueTrackerAsync ( string name , string regex , string url )
223
+ public void AddIssueTracker ( string name , string regex , string url )
212
224
{
213
- SelectedIssueTracker = await _repo . AddIssueTrackerAsync ( name , regex , url ) ;
225
+ var rule = new Models . IssueTracker ( )
226
+ {
227
+ IsShared = false ,
228
+ Name = name ,
229
+ RegexString = regex ,
230
+ URLTemplate = url ,
231
+ } ;
232
+
233
+ IssueTrackers . Add ( rule ) ;
234
+ SelectedIssueTracker = rule ;
214
235
}
215
236
216
- public async Task RemoveIssueTrackerAsync ( )
237
+ public void RemoveIssueTracker ( )
217
238
{
218
239
if ( _selectedIssueTracker is { } rule )
219
- await _repo . RemoveIssueTrackerAsync ( rule ) ;
240
+ IssueTrackers . Remove ( rule ) ;
220
241
221
242
SelectedIssueTracker = null ;
222
243
}
223
244
224
- public async Task ChangeIssueTrackerShareModeAsync ( )
225
- {
226
- if ( _selectedIssueTracker is { } rule )
227
- await _repo . ChangeIssueTrackerShareModeAsync ( rule ) ;
228
- }
229
-
230
245
public void AddNewCustomAction ( )
231
246
{
232
247
SelectedCustomAction = _repo . Settings . AddNewCustomAction ( ) ;
@@ -259,6 +274,8 @@ public async Task SaveAsync()
259
274
await SetIfChangedAsync ( "user.signingkey" , GPGUserSigningKey , "" ) ;
260
275
await SetIfChangedAsync ( "http.proxy" , HttpProxy , "" ) ;
261
276
await SetIfChangedAsync ( "fetch.prune" , EnablePruneOnFetch ? "true" : "false" , "false" ) ;
277
+
278
+ await ApplyIssueTrackerChangesAsync ( ) ;
262
279
}
263
280
264
281
private async Task SetIfChangedAsync ( string key , string value , string defValue )
@@ -267,6 +284,62 @@ private async Task SetIfChangedAsync(string key, string value, string defValue)
267
284
await new Commands . Config ( _repo . FullPath ) . SetAsync ( key , value ) ;
268
285
}
269
286
287
+ private async Task ApplyIssueTrackerChangesAsync ( )
288
+ {
289
+ var changed = false ;
290
+ var oldRules = new Dictionary < string , Models . IssueTracker > ( ) ;
291
+ foreach ( var rule in _repo . IssueTrackers )
292
+ oldRules . Add ( rule . Name , rule ) ;
293
+
294
+ foreach ( var rule in IssueTrackers )
295
+ {
296
+ if ( oldRules . TryGetValue ( rule . Name , out var old ) )
297
+ {
298
+ if ( old . IsShared != rule . IsShared )
299
+ {
300
+ changed = true ;
301
+ await new Commands . IssueTracker ( _repo . FullPath , old . IsShared ) . RemoveAsync ( old . Name ) ;
302
+ await new Commands . IssueTracker ( _repo . FullPath , rule . IsShared ) . AddAsync ( rule ) ;
303
+ }
304
+ else
305
+ {
306
+ if ( ! old . RegexString . Equals ( rule . RegexString , StringComparison . Ordinal ) )
307
+ {
308
+ changed = true ;
309
+ await new Commands . IssueTracker ( _repo . FullPath , old . IsShared ) . UpdateRegexAsync ( rule ) ;
310
+ }
311
+
312
+ if ( ! old . URLTemplate . Equals ( rule . URLTemplate , StringComparison . Ordinal ) )
313
+ {
314
+ changed = true ;
315
+ await new Commands . IssueTracker ( _repo . FullPath , old . IsShared ) . UpdateURLTemplateAsync ( rule ) ;
316
+ }
317
+ }
318
+
319
+ oldRules . Remove ( rule . Name ) ;
320
+ }
321
+ else
322
+ {
323
+ changed = true ;
324
+ await new Commands . IssueTracker ( _repo . FullPath , rule . IsShared ) . AddAsync ( rule ) ;
325
+ }
326
+ }
327
+
328
+ if ( oldRules . Count > 0 )
329
+ {
330
+ changed = true ;
331
+
332
+ foreach ( var kv in oldRules )
333
+ await new Commands . IssueTracker ( _repo . FullPath , kv . Value . IsShared ) . RemoveAsync ( kv . Key ) ;
334
+ }
335
+
336
+ if ( changed )
337
+ {
338
+ _repo . IssueTrackers . Clear ( ) ;
339
+ _repo . IssueTrackers . AddRange ( IssueTrackers ) ;
340
+ }
341
+ }
342
+
270
343
private readonly Repository _repo = null ;
271
344
private readonly Dictionary < string , string > _cached = null ;
272
345
private string _httpProxy ;
0 commit comments