Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions pkg/gui/controllers/switch_to_diff_files_controller.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package controllers

import (
"path/filepath"

"github.com/jesseduffield/lazygit/pkg/commands/models"
"github.com/jesseduffield/lazygit/pkg/gui/types"
)
Expand Down Expand Up @@ -90,6 +92,15 @@ func (self *SwitchToDiffFilesController) enter() error {
Scope: []types.RefreshableView{types.COMMIT_FILES},
})

if filterPath := self.c.Modes().Filtering.GetPath(); filterPath != "" {
path, err := filepath.Rel(self.c.Git().RepoPaths.RepoPath(), filterPath)
if err != nil {
path = filterPath
}
commitFilesContext.CommitFileTreeViewModel.SelectPath(
filepath.ToSlash(path), self.c.UserConfig().Gui.ShowRootItemInFileTree)
}

self.c.Context().Push(commitFilesContext, types.OnFocusOpts{})
return nil
}
Expand Down
8 changes: 6 additions & 2 deletions pkg/gui/filetree/build_tree.go
Original file line number Diff line number Diff line change
Expand Up @@ -162,9 +162,13 @@ func join(strs []string) string {
}

func SplitFileTreePath(path string, showRootItem bool) []string {
return split(InternalTreePathForFilePath(path, showRootItem))
}

func InternalTreePathForFilePath(path string, showRootItem bool) string {
if showRootItem {
return split("./" + path)
return "./" + path
}

return split(path)
return path
}
12 changes: 12 additions & 0 deletions pkg/gui/filetree/commit_file_tree_view_model.go
Original file line number Diff line number Diff line change
Expand Up @@ -191,3 +191,15 @@ func (self *CommitFileTreeViewModel) ExpandAll() {
self.SetSelectedLineIdx(index)
}
}

// Try to select the given path if present. If it doesn't exist, or one of the parent directories is
// collapsed, do nothing.
// Note that filepath is an actual file path, not an internal tree path as with e.g.
// ToggleCollapsed. It must be a relative path (relative to the repo root), and it must contain
// forward slashes rather than backslashes even on Windows.
func (self *CommitFileTreeViewModel) SelectPath(filepath string, showRootItem bool) {
index, found := self.GetIndexForPath(InternalTreePathForFilePath(filepath, showRootItem))
if found {
self.SetSelection(index)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package filter_by_path

import (
"github.com/jesseduffield/lazygit/pkg/config"
. "github.com/jesseduffield/lazygit/pkg/integration/components"
)

var SelectFilteredFileWhenEnteringCommit = NewIntegrationTest(NewIntegrationTestArgs{
Description: "Filter commits by file path, then enter a commit and ensure the file is selected",
ExtraCmdArgs: []string{},
Skip: false,
SetupConfig: func(config *config.AppConfig) {
},
SetupRepo: func(shell *Shell) {
shell.CreateFileAndAdd("file1", "")
shell.CreateFileAndAdd("dir/file2", "")
shell.Commit("add files")
},
Run: func(t *TestDriver, keys config.KeybindingConfig) {
t.GlobalPress(keys.Universal.FilteringMenu)
t.ExpectPopup().Menu().
Title(Equals("Filtering")).
Select(Contains("Enter path to filter by")).
Confirm()

t.ExpectPopup().Prompt().
Title(Equals("Enter path:")).
Type("dir/file2").
Confirm()

t.Views().Commits().
Focus().
Lines(
Contains("add files").IsSelected(),
).
PressEnter()

t.Views().CommitFiles().
IsFocused().
Lines(
Equals("▼ /"),
Equals(" ▼ dir"),
Equals(" A file2").IsSelected(),
Equals(" A file1"),
)
},
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package filter_by_path

import (
"github.com/jesseduffield/lazygit/pkg/config"
. "github.com/jesseduffield/lazygit/pkg/integration/components"
)

var SelectFilteredFileWhenEnteringCommitNoRootItem = NewIntegrationTest(NewIntegrationTestArgs{
Description: "Filter commits by file path, then enter a commit and ensure the file is selected (with the show root item config off)",
ExtraCmdArgs: []string{},
Skip: false,
SetupConfig: func(config *config.AppConfig) {
config.GetUserConfig().Gui.ShowRootItemInFileTree = false
},
SetupRepo: func(shell *Shell) {
shell.CreateFileAndAdd("file1", "")
shell.CreateFileAndAdd("dir/file2", "")
shell.Commit("add files")
},
Run: func(t *TestDriver, keys config.KeybindingConfig) {
t.GlobalPress(keys.Universal.FilteringMenu)
t.ExpectPopup().Menu().
Title(Equals("Filtering")).
Select(Contains("Enter path to filter by")).
Confirm()

t.ExpectPopup().Prompt().
Title(Equals("Enter path:")).
Type("dir/file2").
Confirm()

t.Views().Commits().
Focus().
Lines(
Contains("add files").IsSelected(),
).
PressEnter()

t.Views().CommitFiles().
IsFocused().
Lines(
Equals("▼ dir"),
Equals(" A file2").IsSelected(),
Equals("A file1"),
)
},
})
2 changes: 2 additions & 0 deletions pkg/integration/tests/test_list.go
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,8 @@ var tests = []*components.IntegrationTest{
filter_by_path.KeepSameCommitSelectedOnExit,
filter_by_path.RewordCommitInFilteringMode,
filter_by_path.SelectFile,
filter_by_path.SelectFilteredFileWhenEnteringCommit,
filter_by_path.SelectFilteredFileWhenEnteringCommitNoRootItem,
filter_by_path.ShowDiffsForRenamedFile,
filter_by_path.TypeFile,
interactive_rebase.AdvancedInteractiveRebase,
Expand Down