Skip to content

Commit a5606e8

Browse files
committed
refactor: move codes from Views.FilterModeSwitchButton to ViewModels.Repository
Signed-off-by: leo <[email protected]>
1 parent 66842b1 commit a5606e8

File tree

7 files changed

+185
-231
lines changed

7 files changed

+185
-231
lines changed

src/Models/RepositorySettings.cs

Lines changed: 57 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
using System.Text;
44

55
using Avalonia.Collections;
6-
using Avalonia.Threading;
76

87
namespace SourceGit.Models
98
{
@@ -218,10 +217,26 @@ public bool UpdateHistoriesFilter(string pattern, FilterType type, FilterMode mo
218217
return true;
219218
}
220219

221-
public string BuildHistoriesFilter()
220+
public void RemoveChildrenBranchFilters(string pattern)
222221
{
223-
var builder = new StringBuilder();
222+
var dirty = new List<Filter>();
223+
var prefix = $"{pattern}/";
224+
225+
foreach (var filter in HistoriesFilters)
226+
{
227+
if (filter.Type == FilterType.Tag)
228+
continue;
224229

230+
if (filter.Pattern.StartsWith(prefix, StringComparison.Ordinal))
231+
dirty.Add(filter);
232+
}
233+
234+
foreach (var filter in dirty)
235+
HistoriesFilters.Remove(filter);
236+
}
237+
238+
public string BuildHistoriesFilter()
239+
{
225240
var excludedBranches = new List<string>();
226241
var excludedRemotes = new List<string>();
227242
var excludedTags = new List<string>();
@@ -276,68 +291,69 @@ public string BuildHistoriesFilter()
276291
}
277292
}
278293

279-
foreach (var b in excludedBranches)
280-
{
281-
builder.Append("--exclude=");
282-
builder.Append(b);
283-
builder.Append(' ');
284-
}
294+
bool hasIncluded = includedBranches.Count > 0 || includedRemotes.Count > 0 || includedTags.Count > 0;
295+
bool hasExcluded = excludedBranches.Count > 0 || excludedRemotes.Count > 0 || excludedTags.Count > 0;
285296

286-
if (includedBranches.Count > 0)
297+
var builder = new StringBuilder();
298+
if (hasIncluded)
287299
{
288300
foreach (var b in includedBranches)
289301
{
290302
builder.Append("--branches=");
291303
builder.Append(b);
292304
builder.Append(' ');
293305
}
294-
}
295-
else if (excludedBranches.Count > 0 || (includedRemotes.Count == 0 && includedTags.Count == 0))
296-
{
297-
builder.Append("--exclude=HEA[D] ");
298-
builder.Append("--branches ");
299-
}
300306

301-
foreach (var r in excludedRemotes)
302-
{
303-
builder.Append("--exclude=");
304-
builder.Append(r);
305-
builder.Append(' ');
306-
}
307-
308-
if (includedRemotes.Count > 0)
309-
{
310307
foreach (var r in includedRemotes)
311308
{
312309
builder.Append("--remotes=");
313310
builder.Append(r);
314311
builder.Append(' ');
315312
}
316-
}
317-
else if (excludedRemotes.Count > 0 || (includedBranches.Count == 0 && includedTags.Count == 0))
318-
{
319-
builder.Append("--exclude=origin/HEA[D] ");
320-
builder.Append("--remotes ");
321-
}
322-
323-
foreach (var t in excludedTags)
324-
{
325-
builder.Append("--exclude=");
326-
builder.Append(t);
327-
builder.Append(' ');
328-
}
329313

330-
if (includedTags.Count > 0)
331-
{
332314
foreach (var t in includedTags)
333315
{
334316
builder.Append("--tags=");
335317
builder.Append(t);
336318
builder.Append(' ');
337319
}
338320
}
339-
else if (excludedTags.Count > 0 || (includedBranches.Count == 0 && includedRemotes.Count == 0))
321+
else if (hasExcluded)
340322
{
323+
if (excludedBranches.Count > 0)
324+
{
325+
foreach (var b in excludedBranches)
326+
{
327+
builder.Append("--exclude=");
328+
builder.Append(b);
329+
builder.Append(' ');
330+
}
331+
}
332+
333+
builder.Append("--exclude=HEA[D] --branches ");
334+
335+
if (excludedRemotes.Count > 0)
336+
{
337+
foreach (var r in excludedRemotes)
338+
{
339+
builder.Append("--exclude=");
340+
builder.Append(r);
341+
builder.Append(' ');
342+
}
343+
}
344+
345+
builder.Append("--exclude=origin/HEA[D] --remotes ");
346+
347+
if (excludedTags.Count > 0)
348+
{
349+
foreach (var t in excludedTags)
350+
{
351+
builder.Append("--exclude=");
352+
builder.Append(t);
353+
builder.Append(' ');
354+
}
355+
}
356+
341357
builder.Append("--tags ");
342358
}
343359

src/ViewModels/Checkout.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ public override Task<bool> Sure()
6464
CallUIThread(() =>
6565
{
6666
var b = _repo.Branches.Find(x => x.IsLocal && x.Name == Branch);
67-
if (b != null)
68-
_repo.UpdateHistoriesFilterAfterCheckout(b);
67+
if (b != null && _repo.HistoriesFilterMode == Models.FilterMode.Included)
68+
_repo.Settings.UpdateHistoriesFilter(b.FullName, Models.FilterType.LocalBranch, Models.FilterMode.Included);
6969

7070
_repo.MarkBranchesDirtyManually();
7171
_repo.SetWatcherEnabled(true);

src/ViewModels/CreateBranch.cs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -125,14 +125,8 @@ public override Task<bool> Sure()
125125

126126
CallUIThread(() =>
127127
{
128-
if (CheckoutAfterCreated)
129-
{
130-
_repo.UpdateHistoriesFilterAfterCheckout(new Models.Branch()
131-
{
132-
FullName = $"refs/heads/{_name}",
133-
Upstream = BasedOn is Models.Branch { IsLocal: false } remoteBranch ? remoteBranch.FullName : string.Empty,
134-
});
135-
}
128+
if (CheckoutAfterCreated && _repo.HistoriesFilterMode == Models.FilterMode.Included)
129+
_repo.Settings.UpdateHistoriesFilter($"refs/heads/{_name}", Models.FilterType.LocalBranch, Models.FilterMode.Included);
136130

137131
_repo.MarkBranchesDirtyManually();
138132
_repo.SetWatcherEnabled(true);

src/ViewModels/Repository.cs

Lines changed: 107 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,12 @@ public Models.RepositorySettings Settings
4646
get => _settings;
4747
}
4848

49+
public Models.FilterMode HistoriesFilterMode
50+
{
51+
get => _historiesFilterMode;
52+
private set => SetProperty(ref _historiesFilterMode, value);
53+
}
54+
4955
public bool HasAllowedSignersFile
5056
{
5157
get => _hasAllowedSignersFile;
@@ -383,6 +389,11 @@ public void Open()
383389
App.RaiseException(string.Empty, $"Failed to start watcher for repository: '{_fullpath}'. You may need to press 'F5' to refresh repository manually!\n\nReason: {ex.Message}");
384390
}
385391

392+
if (_settings.HistoriesFilters.Count > 0)
393+
_historiesFilterMode = _settings.HistoriesFilters[0].Mode;
394+
else
395+
_historiesFilterMode = Models.FilterMode.None;
396+
386397
_histories = new Histories(this);
387398
_workingCopy = new WorkingCopy(this);
388399
_stashesPage = new StashesPage(this);
@@ -407,6 +418,7 @@ public void Close()
407418
// Ignore
408419
}
409420
_settings = null;
421+
_historiesFilterMode = Models.FilterMode.None;
410422

411423
_autoFetchTimer.Dispose();
412424
_autoFetchTimer = null;
@@ -670,49 +682,92 @@ public void NavigateToCurrentHead()
670682
public void ClearHistoriesFilter()
671683
{
672684
_settings.HistoriesFilters.Clear();
685+
HistoriesFilterMode = Models.FilterMode.None;
686+
673687
ResetBranchTreeFilterMode(LocalBranchTrees);
674688
ResetBranchTreeFilterMode(RemoteBranchTrees);
675689
ResetTagFilterMode();
676690
Task.Run(RefreshCommits);
677691
}
678692

679-
public void MarkHistoriesFilterDirty()
693+
public void SetTagFilterMode(Models.Tag tag, Models.FilterMode mode)
680694
{
681-
UpdateBranchTreeFilterMode(LocalBranchTrees, true);
682-
UpdateBranchTreeFilterMode(RemoteBranchTrees, false);
683-
UpdateTagFilterMode();
684-
Task.Run(RefreshCommits);
695+
var changed = _settings.UpdateHistoriesFilter(tag.Name, Models.FilterType.Tag, mode);
696+
if (changed)
697+
{
698+
if (mode != Models.FilterMode.None || _settings.HistoriesFilters.Count == 0)
699+
HistoriesFilterMode = mode;
700+
701+
RefreshHistoriesFilters();
702+
}
685703
}
686704

687-
public void UpdateHistoriesFilterAfterCheckout(Models.Branch local)
705+
public void SetBranchFilterMode(BranchTreeNode node, Models.FilterMode mode)
688706
{
689-
var hasIncludedBranch = false;
690-
foreach (var filter in _settings.HistoriesFilters)
707+
var isLocal = node.Path.StartsWith("refs/heads/", StringComparison.Ordinal);
708+
var tree = isLocal ? _localBranchTrees : _remoteBranchTrees;
709+
710+
if (node.Backend is Models.Branch branch)
691711
{
692-
if (filter.Type == Models.FilterType.LocalBranch)
693-
{
694-
if (filter.Pattern.Equals(local.FullName, StringComparison.Ordinal))
695-
return;
712+
var type = isLocal ? Models.FilterType.LocalBranch : Models.FilterType.RemoteBranch;
713+
var changed = _settings.UpdateHistoriesFilter(node.Path, type, mode);
714+
if (!changed)
715+
return;
696716

697-
hasIncludedBranch |= filter.Mode == Models.FilterMode.Included;
698-
}
699-
else if (filter.Type == Models.FilterType.LocalBranchFolder)
717+
if (isLocal && !string.IsNullOrEmpty(branch.Upstream) && mode != Models.FilterMode.Excluded)
700718
{
701-
if (local.FullName.StartsWith(filter.Pattern, StringComparison.Ordinal))
702-
return;
719+
var upstream = branch.Upstream;
720+
var canUpdateUpstream = true;
721+
foreach (var filter in _settings.HistoriesFilters)
722+
{
723+
bool matched = false;
724+
if (filter.Type == Models.FilterType.RemoteBranch)
725+
matched = filter.Pattern.Equals(upstream, StringComparison.Ordinal);
726+
else if (filter.Type == Models.FilterType.RemoteBranchFolder)
727+
matched = upstream.StartsWith(filter.Pattern, StringComparison.Ordinal);
703728

704-
hasIncludedBranch |= filter.Mode == Models.FilterMode.Included;
705-
}
706-
else if (filter.Type == Models.FilterType.RemoteBranch || filter.Type == Models.FilterType.RemoteBranchFolder)
707-
{
708-
hasIncludedBranch |= filter.Mode == Models.FilterMode.Included;
729+
if (matched && filter.Mode == Models.FilterMode.Excluded)
730+
{
731+
canUpdateUpstream = false;
732+
break;
733+
}
734+
}
735+
736+
if (canUpdateUpstream)
737+
_settings.UpdateHistoriesFilter(upstream, Models.FilterType.RemoteBranch, mode);
709738
}
710739
}
740+
else
741+
{
742+
var type = isLocal ? Models.FilterType.LocalBranchFolder : Models.FilterType.RemoteBranchFolder;
743+
var changed = _settings.UpdateHistoriesFilter(node.Path, type, mode);
744+
if (!changed)
745+
return;
711746

712-
if (!hasIncludedBranch)
713-
return;
747+
_settings.RemoveChildrenBranchFilters(node.Path);
748+
}
749+
750+
var parentType = isLocal ? Models.FilterType.LocalBranchFolder : Models.FilterType.RemoteBranchFolder;
751+
var cur = node;
752+
do
753+
{
754+
var lastSepIdx = cur.Path.LastIndexOf('/');
755+
if (lastSepIdx <= 0)
756+
break;
714757

715-
_settings.UpdateHistoriesFilter(local.FullName, Models.FilterType.LocalBranch, Models.FilterMode.Included);
758+
var parentPath = cur.Path.Substring(0, lastSepIdx);
759+
var parent = FindBranchNode(tree, parentPath);
760+
if (parent == null)
761+
break;
762+
763+
_settings.UpdateHistoriesFilter(parent.Path, parentType, Models.FilterMode.None);
764+
cur = parent;
765+
} while (true);
766+
767+
if (mode != Models.FilterMode.None || _settings.HistoriesFilters.Count == 0)
768+
HistoriesFilterMode = mode;
769+
770+
RefreshHistoriesFilters();
716771
}
717772

718773
public void StashAll(bool autoStart)
@@ -2023,6 +2078,14 @@ private BranchTreeNode.Builder BuildBranchTree(List<Models.Branch> branches, Lis
20232078
return visible;
20242079
}
20252080

2081+
private void RefreshHistoriesFilters()
2082+
{
2083+
UpdateBranchTreeFilterMode(LocalBranchTrees, true);
2084+
UpdateBranchTreeFilterMode(RemoteBranchTrees, false);
2085+
UpdateTagFilterMode();
2086+
Task.Run(RefreshCommits);
2087+
}
2088+
20262089
private void UpdateBranchTreeFilterMode(List<BranchTreeNode> nodes, bool isLocal)
20272090
{
20282091
foreach (var node in nodes)
@@ -2061,6 +2124,24 @@ private void ResetTagFilterMode()
20612124
tag.FilterMode = Models.FilterMode.None;
20622125
}
20632126

2127+
private BranchTreeNode FindBranchNode(List<BranchTreeNode> nodes, string path)
2128+
{
2129+
foreach (var node in nodes)
2130+
{
2131+
if (node.Path.Equals(path, StringComparison.Ordinal))
2132+
return node;
2133+
2134+
if (path.StartsWith(node.Path, StringComparison.Ordinal))
2135+
{
2136+
var founded = FindBranchNode(node.Children, path);
2137+
if (founded != null)
2138+
return founded;
2139+
}
2140+
}
2141+
2142+
return null;
2143+
}
2144+
20642145
private void UpdateCurrentRevisionFilesForSearchSuggestion()
20652146
{
20662147
_revisionFiles.Clear();
@@ -2124,6 +2205,7 @@ private void AutoFetchImpl(object sender)
21242205
private string _fullpath = string.Empty;
21252206
private string _gitDir = string.Empty;
21262207
private Models.RepositorySettings _settings = null;
2208+
private Models.FilterMode _historiesFilterMode = Models.FilterMode.None;
21272209
private bool _hasAllowedSignersFile = false;
21282210

21292211
private Models.Watcher _watcher = null;

0 commit comments

Comments
 (0)