@@ -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 \n Reason: { 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