@@ -46,6 +46,12 @@ public Models.RepositorySettings Settings
46
46
get => _settings ;
47
47
}
48
48
49
+ public Models . FilterMode HistoriesFilterMode
50
+ {
51
+ get => _historiesFilterMode ;
52
+ private set => SetProperty ( ref _historiesFilterMode , value ) ;
53
+ }
54
+
49
55
public bool HasAllowedSignersFile
50
56
{
51
57
get => _hasAllowedSignersFile ;
@@ -383,6 +389,11 @@ public void Open()
383
389
App . RaiseException ( string . Empty , $ "Failed to start watcher for repository: '{ _fullpath } '. You may need to press 'F5' to refresh repository manually!\n \n Reason: { ex . Message } ") ;
384
390
}
385
391
392
+ if ( _settings . HistoriesFilters . Count > 0 )
393
+ _historiesFilterMode = _settings . HistoriesFilters [ 0 ] . Mode ;
394
+ else
395
+ _historiesFilterMode = Models . FilterMode . None ;
396
+
386
397
_histories = new Histories ( this ) ;
387
398
_workingCopy = new WorkingCopy ( this ) ;
388
399
_stashesPage = new StashesPage ( this ) ;
@@ -407,6 +418,7 @@ public void Close()
407
418
// Ignore
408
419
}
409
420
_settings = null ;
421
+ _historiesFilterMode = Models . FilterMode . None ;
410
422
411
423
_autoFetchTimer . Dispose ( ) ;
412
424
_autoFetchTimer = null ;
@@ -670,49 +682,92 @@ public void NavigateToCurrentHead()
670
682
public void ClearHistoriesFilter ( )
671
683
{
672
684
_settings . HistoriesFilters . Clear ( ) ;
685
+ HistoriesFilterMode = Models . FilterMode . None ;
686
+
673
687
ResetBranchTreeFilterMode ( LocalBranchTrees ) ;
674
688
ResetBranchTreeFilterMode ( RemoteBranchTrees ) ;
675
689
ResetTagFilterMode ( ) ;
676
690
Task . Run ( RefreshCommits ) ;
677
691
}
678
692
679
- public void MarkHistoriesFilterDirty ( )
693
+ public void SetTagFilterMode ( Models . Tag tag , Models . FilterMode mode )
680
694
{
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
+ }
685
703
}
686
704
687
- public void UpdateHistoriesFilterAfterCheckout ( Models . Branch local )
705
+ public void SetBranchFilterMode ( BranchTreeNode node , Models . FilterMode mode )
688
706
{
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 )
691
711
{
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 ;
696
716
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 )
700
718
{
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 ) ;
703
728
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 ) ;
709
738
}
710
739
}
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 ;
711
746
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 ;
714
757
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 ( ) ;
716
771
}
717
772
718
773
public void StashAll ( bool autoStart )
@@ -2023,6 +2078,14 @@ private BranchTreeNode.Builder BuildBranchTree(List<Models.Branch> branches, Lis
2023
2078
return visible ;
2024
2079
}
2025
2080
2081
+ private void RefreshHistoriesFilters ( )
2082
+ {
2083
+ UpdateBranchTreeFilterMode ( LocalBranchTrees , true ) ;
2084
+ UpdateBranchTreeFilterMode ( RemoteBranchTrees , false ) ;
2085
+ UpdateTagFilterMode ( ) ;
2086
+ Task . Run ( RefreshCommits ) ;
2087
+ }
2088
+
2026
2089
private void UpdateBranchTreeFilterMode ( List < BranchTreeNode > nodes , bool isLocal )
2027
2090
{
2028
2091
foreach ( var node in nodes )
@@ -2061,6 +2124,24 @@ private void ResetTagFilterMode()
2061
2124
tag . FilterMode = Models . FilterMode . None ;
2062
2125
}
2063
2126
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
+
2064
2145
private void UpdateCurrentRevisionFilesForSearchSuggestion ( )
2065
2146
{
2066
2147
_revisionFiles . Clear ( ) ;
@@ -2124,6 +2205,7 @@ private void AutoFetchImpl(object sender)
2124
2205
private string _fullpath = string . Empty ;
2125
2206
private string _gitDir = string . Empty ;
2126
2207
private Models . RepositorySettings _settings = null ;
2208
+ private Models . FilterMode _historiesFilterMode = Models . FilterMode . None ;
2127
2209
private bool _hasAllowedSignersFile = false ;
2128
2210
2129
2211
private Models . Watcher _watcher = null ;
0 commit comments