1- using System . Collections . Generic ;
1+ using System ;
2+ using System . Collections . Generic ;
23using System . Threading . Tasks ;
34
45using Avalonia . Collections ;
@@ -114,8 +115,8 @@ public Models.CommitTemplate SelectedCommitTemplate
114115
115116 public AvaloniaList < Models . IssueTracker > IssueTrackers
116117 {
117- get => _repo . IssueTrackers ;
118- }
118+ get ;
119+ } = [ ] ;
119120
120121 public Models . IssueTracker SelectedIssueTracker
121122 {
@@ -176,6 +177,17 @@ public RepositoryConfigure(Repository repo)
176177 HttpProxy = proxy ;
177178 if ( _cached . TryGetValue ( "fetch.prune" , out var prune ) )
178179 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+ }
179191 }
180192
181193 public void ClearHttpProxy ( )
@@ -208,25 +220,28 @@ public List<string> GetRemoteVisitUrls()
208220 return outs ;
209221 }
210222
211- public async Task AddIssueTrackerAsync ( string name , string regex , string url )
223+ public void AddIssueTracker ( string name , string regex , string url )
212224 {
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 ;
214235 }
215236
216- public async Task RemoveIssueTrackerAsync ( )
237+ public void RemoveIssueTracker ( )
217238 {
218239 if ( _selectedIssueTracker is { } rule )
219- await _repo . RemoveIssueTrackerAsync ( rule ) ;
240+ IssueTrackers . Remove ( rule ) ;
220241
221242 SelectedIssueTracker = null ;
222243 }
223244
224- public async Task ChangeIssueTrackerShareModeAsync ( )
225- {
226- if ( _selectedIssueTracker is { } rule )
227- await _repo . ChangeIssueTrackerShareModeAsync ( rule ) ;
228- }
229-
230245 public void AddNewCustomAction ( )
231246 {
232247 SelectedCustomAction = _repo . Settings . AddNewCustomAction ( ) ;
@@ -259,6 +274,8 @@ public async Task SaveAsync()
259274 await SetIfChangedAsync ( "user.signingkey" , GPGUserSigningKey , "" ) ;
260275 await SetIfChangedAsync ( "http.proxy" , HttpProxy , "" ) ;
261276 await SetIfChangedAsync ( "fetch.prune" , EnablePruneOnFetch ? "true" : "false" , "false" ) ;
277+
278+ await ApplyIssueTrackerChangesAsync ( ) ;
262279 }
263280
264281 private async Task SetIfChangedAsync ( string key , string value , string defValue )
@@ -267,6 +284,62 @@ private async Task SetIfChangedAsync(string key, string value, string defValue)
267284 await new Commands . Config ( _repo . FullPath ) . SetAsync ( key , value ) ;
268285 }
269286
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+
270343 private readonly Repository _repo = null ;
271344 private readonly Dictionary < string , string > _cached = null ;
272345 private string _httpProxy ;
0 commit comments