From a92f7bc35325c96e6f9d38d64d328725137cf5ea Mon Sep 17 00:00:00 2001 From: hltu1 Date: Mon, 12 Oct 2026 20:47:18 +0300 Subject: [PATCH 1/2] fix: keep folder filter when checking out or creating a branch inside it When the history is filtered with an included branch folder, checking out (or creating and checking out) a branch inside that folder replaced the folder filter with a filter for just that branch, because the automatic include also unsets every parent folder filter. Skip the automatic include when an ancestor folder filter with the same mode already covers the branch. Manual include clicks are unchanged. Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_01SQ4PfsLku4ovivLiux3cYo --- src/Models/RepositoryUIStates.cs | 20 ++++++++++++++++++++ src/ViewModels/Repository.cs | 6 ++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/Models/RepositoryUIStates.cs b/src/Models/RepositoryUIStates.cs index 0b35f8d618..45d587c39a 100644 --- a/src/Models/RepositoryUIStates.cs +++ b/src/Models/RepositoryUIStates.cs @@ -357,6 +357,26 @@ public bool UpdateHistoryFilters(string pattern, FilterType type, FilterMode mod return true; } + public bool IsCoveredByFolderFilter(string path, FilterMode mode) + { + var idx = path.LastIndexOf('/'); + while (idx > 0) + { + var parent = path.Substring(0, idx); + foreach (var filter in HistoryFilters) + { + if (filter.Type is FilterType.LocalBranchFolder or FilterType.RemoteBranchFolder && + filter.Mode == mode && + filter.Pattern.Equals(parent, StringComparison.Ordinal)) + return true; + } + + idx = parent.LastIndexOf('/'); + } + + return false; + } + public void RemoveHistoryFilter(string pattern, FilterType type) { foreach (var filter in HistoryFilters) diff --git a/src/ViewModels/Repository.cs b/src/ViewModels/Repository.cs index aa58226d97..31f79c21f8 100644 --- a/src/ViewModels/Repository.cs +++ b/src/ViewModels/Repository.cs @@ -774,7 +774,8 @@ public void RefreshAfterCreateBranch(Models.Branch created, bool checkout) if (folderEndIdx > 10) _uiStates.ExpandedBranchNodesInSideBar.Add(created.FullName.Substring(0, folderEndIdx)); - if (_historyFilterMode == Models.FilterMode.Included) + if (_historyFilterMode == Models.FilterMode.Included && + !_uiStates.IsCoveredByFolderFilter(created.FullName, Models.FilterMode.Included)) SetBranchFilterMode(created, Models.FilterMode.Included, false, false); CurrentBranch = created; @@ -817,7 +818,8 @@ public void RefreshAfterCheckoutBranch(Models.Branch checkouted) checkouted.IsCurrent = true; checkouted.WorktreePath = FullPath; - if (_historyFilterMode == Models.FilterMode.Included) + if (_historyFilterMode == Models.FilterMode.Included && + !_uiStates.IsCoveredByFolderFilter(checkouted.FullName, Models.FilterMode.Included)) SetBranchFilterMode(checkouted, Models.FilterMode.Included, false, false); List locals = []; From fbe99fe616f276af5cb359c5d00b2cab2a837596 Mon Sep 17 00:00:00 2001 From: leo Date: Tue, 13 Oct 2026 10:22:15 +0800 Subject: [PATCH 2/2] code_review: PR #2778 - Check `FilterType` instead of `FilterMode` since we have already checked the `_histroryFilterMode`. - Simplify `IsCoveredByFolderFilter` Signed-off-by: leo --- src/Models/RepositoryUIStates.cs | 17 ++++------------- src/ViewModels/Repository.cs | 4 ++-- 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/src/Models/RepositoryUIStates.cs b/src/Models/RepositoryUIStates.cs index 45d587c39a..8657b93b65 100644 --- a/src/Models/RepositoryUIStates.cs +++ b/src/Models/RepositoryUIStates.cs @@ -357,21 +357,12 @@ public bool UpdateHistoryFilters(string pattern, FilterType type, FilterMode mod return true; } - public bool IsCoveredByFolderFilter(string path, FilterMode mode) + public bool IsCoveredByFolderFilter(string path, FilterType type) { - var idx = path.LastIndexOf('/'); - while (idx > 0) + foreach (var filter in HistoryFilters) { - var parent = path.Substring(0, idx); - foreach (var filter in HistoryFilters) - { - if (filter.Type is FilterType.LocalBranchFolder or FilterType.RemoteBranchFolder && - filter.Mode == mode && - filter.Pattern.Equals(parent, StringComparison.Ordinal)) - return true; - } - - idx = parent.LastIndexOf('/'); + if (filter.Type == type && path.StartsWith($"{filter.Pattern}/", StringComparison.Ordinal)) + return true; } return false; diff --git a/src/ViewModels/Repository.cs b/src/ViewModels/Repository.cs index 31f79c21f8..1ea5951a83 100644 --- a/src/ViewModels/Repository.cs +++ b/src/ViewModels/Repository.cs @@ -775,7 +775,7 @@ public void RefreshAfterCreateBranch(Models.Branch created, bool checkout) _uiStates.ExpandedBranchNodesInSideBar.Add(created.FullName.Substring(0, folderEndIdx)); if (_historyFilterMode == Models.FilterMode.Included && - !_uiStates.IsCoveredByFolderFilter(created.FullName, Models.FilterMode.Included)) + !_uiStates.IsCoveredByFolderFilter(created.FullName, Models.FilterType.LocalBranchFolder)) SetBranchFilterMode(created, Models.FilterMode.Included, false, false); CurrentBranch = created; @@ -819,7 +819,7 @@ public void RefreshAfterCheckoutBranch(Models.Branch checkouted) checkouted.IsCurrent = true; checkouted.WorktreePath = FullPath; if (_historyFilterMode == Models.FilterMode.Included && - !_uiStates.IsCoveredByFolderFilter(checkouted.FullName, Models.FilterMode.Included)) + !_uiStates.IsCoveredByFolderFilter(checkouted.FullName, Models.FilterType.LocalBranchFolder)) SetBranchFilterMode(checkouted, Models.FilterMode.Included, false, false); List locals = [];