mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-11-23 22:24:51 +02:00
Use git ls-files to list all file suggestions
This commit is contained in:
@@ -451,3 +451,19 @@ func (self *WorkingTreeCommands) MergeFileForObjectIDs(strategy string, oursID s
|
||||
|
||||
return self.cmd.New(cmdArgs).RunWithOutput()
|
||||
}
|
||||
|
||||
// Returns all tracked files in the repo (not in the working tree). The returned entries are
|
||||
// relative paths to the repo root, using '/' as the path separator on all platforms.
|
||||
// Does not really belong in WorkingTreeCommands, but it's close enough, and we don't seem to have a
|
||||
// better place for it right now.
|
||||
func (self *WorkingTreeCommands) AllRepoFiles() ([]string, error) {
|
||||
cmdArgs := NewGitCmd("ls-files").Arg("-z").ToArgv()
|
||||
output, err := self.cmd.New(cmdArgs).DontLog().RunWithOutput()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if output == "" {
|
||||
return []string{}, nil
|
||||
}
|
||||
return strings.Split(strings.TrimRight(output, "\x00"), "\x00"), nil
|
||||
}
|
||||
|
||||
@@ -563,3 +563,32 @@ func TestWorkingTreeResetHard(t *testing.T) {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestWorkingTreeCommands_AllRepoFiles(t *testing.T) {
|
||||
scenarios := []struct {
|
||||
name string
|
||||
runner *oscommands.FakeCmdObjRunner
|
||||
expected []string
|
||||
}{
|
||||
{
|
||||
name: "no files",
|
||||
runner: oscommands.NewFakeRunner(t).
|
||||
ExpectGitArgs([]string{"ls-files", "-z"}, "", nil),
|
||||
expected: []string{},
|
||||
},
|
||||
{
|
||||
name: "two files",
|
||||
runner: oscommands.NewFakeRunner(t).
|
||||
ExpectGitArgs([]string{"ls-files", "-z"}, "dir/file1.txt\x00dir2/file2.go\x00", nil),
|
||||
expected: []string{"dir/file1.txt", "dir2/file2.go"},
|
||||
},
|
||||
}
|
||||
for _, s := range scenarios {
|
||||
t.Run(s.name, func(t *testing.T) {
|
||||
instance := buildWorkingTreeCommands(commonDeps{runner: s.runner})
|
||||
result, err := instance.AllRepoFiles()
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, s.expected, result)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,15 +2,14 @@ package helpers
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/jesseduffield/generics/set"
|
||||
"github.com/jesseduffield/gocui"
|
||||
"github.com/jesseduffield/lazygit/pkg/commands/models"
|
||||
"github.com/jesseduffield/lazygit/pkg/gui/presentation"
|
||||
"github.com/jesseduffield/lazygit/pkg/gui/types"
|
||||
"github.com/jesseduffield/lazygit/pkg/utils"
|
||||
"github.com/jesseduffield/minimal/gitignore"
|
||||
"github.com/samber/lo"
|
||||
"golang.org/x/exp/slices"
|
||||
"gopkg.in/ozeidan/fuzzy-patricia.v3/patricia"
|
||||
@@ -92,22 +91,28 @@ func (self *SuggestionsHelper) GetBranchNameSuggestionsFunc() func(string) []*ty
|
||||
func (self *SuggestionsHelper) GetFilePathSuggestionsFunc() func(string) []*types.Suggestion {
|
||||
_ = self.c.WithWaitingStatus(self.c.Tr.LoadingFileSuggestions, func(gocui.Task) error {
|
||||
trie := patricia.NewTrie()
|
||||
// load every non-gitignored file in the repo
|
||||
ignore, err := gitignore.FromGit()
|
||||
|
||||
// load every file in the repo
|
||||
files, err := self.c.Git().WorkingTree.AllRepoFiles()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = ignore.Walk(".",
|
||||
func(path string, info os.FileInfo, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
seen := set.New[string]()
|
||||
for _, file := range files {
|
||||
// For every file we also want to add its parent directories, but only once.
|
||||
for i := range len(file) {
|
||||
if file[i] == '/' {
|
||||
dir := file[:i]
|
||||
if !seen.Includes(dir) {
|
||||
trie.Insert(patricia.Prefix(dir), dir)
|
||||
seen.Add(dir)
|
||||
}
|
||||
}
|
||||
if path != "." {
|
||||
trie.Insert(patricia.Prefix(path), path)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
trie.Insert(patricia.Prefix(file), file)
|
||||
}
|
||||
|
||||
// cache the trie for future use
|
||||
self.c.Model().FilesTrie = trie
|
||||
|
||||
Reference in New Issue
Block a user