diff --git a/pkg/gui/controllers/commits_files_controller.go b/pkg/gui/controllers/commits_files_controller.go index d129b3f90..6c8f49e1f 100644 --- a/pkg/gui/controllers/commits_files_controller.go +++ b/pkg/gui/controllers/commits_files_controller.go @@ -642,11 +642,16 @@ func normalisedSelectedCommitFileNodes(selectedNodes []*filetree.CommitFileNode) } func isDescendentOfSelectedCommitFileNodes(node *filetree.CommitFileNode, selectedNodes []*filetree.CommitFileNode) bool { - for _, selectedNode := range selectedNodes { - selectedNodePath := selectedNode.GetPath() - nodePath := node.GetPath() + nodePath := node.GetInternalPath() - if strings.HasPrefix(nodePath, selectedNodePath) && nodePath != selectedNodePath { + for _, selectedNode := range selectedNodes { + if selectedNode.IsFile() { + continue + } + + selectedNodePath := selectedNode.GetInternalPath() + + if strings.HasPrefix(nodePath, selectedNodePath+"/") { return true } } diff --git a/pkg/gui/controllers/files_controller.go b/pkg/gui/controllers/files_controller.go index 656da1bf5..567b0b6e5 100644 --- a/pkg/gui/controllers/files_controller.go +++ b/pkg/gui/controllers/files_controller.go @@ -1552,6 +1552,8 @@ func normalisedSelectedNodes(selectedNodes []*filetree.FileNode) []*filetree.Fil }) } +// NOTE: there's a duplicate of this function in commits_files_controller.go; if you make +// changes here, make them there, too. (We should unify them using generics.) func isDescendentOfSelectedNodes(node *filetree.FileNode, selectedNodes []*filetree.FileNode) bool { nodePath := node.GetInternalPath() diff --git a/pkg/integration/tests/patch_building/select_direcories_sharing_prefix.go b/pkg/integration/tests/patch_building/select_direcories_sharing_prefix.go new file mode 100644 index 000000000..bd20e4ff5 --- /dev/null +++ b/pkg/integration/tests/patch_building/select_direcories_sharing_prefix.go @@ -0,0 +1,53 @@ +package patch_building + +import ( + "github.com/jesseduffield/lazygit/pkg/config" + . "github.com/jesseduffield/lazygit/pkg/integration/components" +) + +var SelectDirecoriesSharingPrefix = NewIntegrationTest(NewIntegrationTestArgs{ + Description: "Select directories sharing a prefix in the commit files view and add them to a custom patch", + ExtraCmdArgs: []string{}, + Skip: false, + SetupConfig: func(config *config.AppConfig) {}, + SetupRepo: func(shell *Shell) { + shell.CreateFileAndAdd("foo/file", "file1 content") + shell.CreateFileAndAdd("foobar/file", "file2 content") + shell.Commit("first commit") + }, + Run: func(t *TestDriver, keys config.KeybindingConfig) { + t.Views().Commits(). + Focus(). + Lines( + Contains("first commit").IsSelected(), + ). + PressEnter() + + t.Views().CommitFiles(). + IsFocused(). + Lines( + Equals("▼ /").IsSelected(), + Equals(" ▼ foo"), + Equals(" A file"), + Equals(" ▼ foobar"), + Equals(" A file"), + ). + SelectNextItem(). + Press(keys.Universal.ToggleRangeSelect). + NavigateToLine(Contains("foobar")). + PressPrimaryAction(). + Lines( + Equals("▼ /"), + Equals(" ▼ foo").IsSelected(), + Equals(" ● file").IsSelected(), + Equals(" ▼ foobar").IsSelected(), + Equals(" ● file"), + ) + + t.Views().Information().Content(Contains("Building patch")) + + t.Views().Secondary().Content( + Contains("foo/file").Contains("foobar/file"), + ) + }, +}) diff --git a/pkg/integration/tests/test_list.go b/pkg/integration/tests/test_list.go index 07a12e2be..77e54e265 100644 --- a/pkg/integration/tests/test_list.go +++ b/pkg/integration/tests/test_list.go @@ -382,6 +382,7 @@ var tests = []*components.IntegrationTest{ patch_building.RenamedFileWhole, patch_building.ResetWithEscape, patch_building.SelectAllFiles, + patch_building.SelectDirecoriesSharingPrefix, patch_building.SpecificSelection, patch_building.StartNewPatch, patch_building.ToggleDirectory,