1
0
mirror of https://github.com/jesseduffield/lazygit.git synced 2024-12-12 11:15:00 +02:00
lazygit/pkg/commands/git_commands/file_loader.go

126 lines
2.9 KiB
Go
Raw Normal View History

package git_commands
2020-09-29 11:22:26 +02:00
import (
"fmt"
"strings"
"github.com/jesseduffield/lazygit/pkg/commands/models"
2021-12-30 08:19:01 +02:00
"github.com/jesseduffield/lazygit/pkg/commands/oscommands"
"github.com/jesseduffield/lazygit/pkg/common"
2020-09-29 11:22:26 +02:00
)
2022-01-02 01:34:33 +02:00
type FileLoaderConfig interface {
GetShowUntrackedFiles() string
}
2021-12-30 08:19:01 +02:00
type FileLoader struct {
*common.Common
cmd oscommands.ICmdObjBuilder
2022-01-02 01:34:33 +02:00
config FileLoaderConfig
2021-12-30 08:19:01 +02:00
getFileType func(string) string
}
2022-01-02 01:34:33 +02:00
func NewFileLoader(cmn *common.Common, cmd oscommands.ICmdObjBuilder, config FileLoaderConfig) *FileLoader {
2021-12-30 08:19:01 +02:00
return &FileLoader{
Common: cmn,
cmd: cmd,
getFileType: oscommands.FileType,
2022-01-02 01:34:33 +02:00
config: config,
2021-12-30 08:19:01 +02:00
}
}
2020-09-29 12:03:39 +02:00
type GetStatusFileOptions struct {
NoRenames bool
}
2021-12-30 08:19:01 +02:00
func (self *FileLoader) GetStatusFiles(opts GetStatusFileOptions) []*models.File {
2020-09-29 11:22:26 +02:00
// check if config wants us ignoring untracked files
2022-01-02 01:34:33 +02:00
untrackedFilesSetting := self.config.GetShowUntrackedFiles()
2020-09-29 11:22:26 +02:00
if untrackedFilesSetting == "" {
untrackedFilesSetting = "all"
}
untrackedFilesArg := fmt.Sprintf("--untracked-files=%s", untrackedFilesSetting)
statuses, err := self.gitStatus(GitStatusOptions{NoRenames: opts.NoRenames, UntrackedFilesArg: untrackedFilesArg})
2020-09-29 11:22:26 +02:00
if err != nil {
2021-12-30 08:19:01 +02:00
self.Log.Error(err)
2020-09-29 11:22:26 +02:00
}
files := []*models.File{}
for _, status := range statuses {
if strings.HasPrefix(status.StatusString, "warning") {
2021-12-30 08:19:01 +02:00
self.Log.Warningf("warning when calling git status: %s", status.StatusString)
2020-09-29 11:22:26 +02:00
continue
}
file := &models.File{
Name: status.Name,
PreviousName: status.PreviousName,
DisplayString: status.StatusString,
Type: self.getFileType(status.Name),
2020-09-29 11:22:26 +02:00
}
models.SetStatusFields(file, status.Change)
2020-09-29 11:22:26 +02:00
files = append(files, file)
}
2020-09-29 11:22:26 +02:00
return files
}
// GitStatus returns the file status of the repo
2020-09-29 11:22:26 +02:00
type GitStatusOptions struct {
NoRenames bool
UntrackedFilesArg string
}
type FileStatus struct {
StatusString string
Change string // ??, MM, AM, ...
Name string
PreviousName string
}
func (c *FileLoader) gitStatus(opts GitStatusOptions) ([]FileStatus, error) {
cmdArgs := NewGitCmd("status").
Arg(opts.UntrackedFilesArg).
Arg("--porcelain").
Arg("-z").
ArgIf(opts.NoRenames, "--no-renames").
ToArgv()
2020-09-29 11:22:26 +02:00
statusLines, _, err := c.cmd.New(cmdArgs).DontLog().RunWithOutputs()
if err != nil {
return []FileStatus{}, err
}
2021-03-14 04:20:54 +02:00
splitLines := strings.Split(statusLines, "\x00")
response := []FileStatus{}
for i := 0; i < len(splitLines); i++ {
2021-03-14 04:20:54 +02:00
original := splitLines[i]
if len(original) < 3 {
continue
}
status := FileStatus{
StatusString: original,
Change: original[:2],
Name: original[3:],
PreviousName: "",
}
if strings.HasPrefix(status.Change, "R") {
// if a line starts with 'R' then the next line is the original file.
status.PreviousName = splitLines[i+1]
status.StatusString = fmt.Sprintf("%s %s -> %s", status.Change, status.PreviousName, status.Name)
i++
2021-03-14 04:20:54 +02:00
}
response = append(response, status)
2021-03-14 04:20:54 +02:00
}
return response, nil
2020-09-29 11:22:26 +02:00
}