diff --git a/pkg/commands/git_commands/repo_paths.go b/pkg/commands/git_commands/repo_paths.go index c2e77d446..a355a45ba 100644 --- a/pkg/commands/git_commands/repo_paths.go +++ b/pkg/commands/git_commands/repo_paths.go @@ -3,7 +3,6 @@ package git_commands import ( ioFs "io/fs" "os" - "path" "path/filepath" "strings" @@ -64,9 +63,9 @@ func (self *RepoPaths) IsBareRepo() bool { func MockRepoPaths(currentPath string) *RepoPaths { return &RepoPaths{ worktreePath: currentPath, - worktreeGitDirPath: path.Join(currentPath, ".git"), + worktreeGitDirPath: filepath.Join(currentPath, ".git"), repoPath: currentPath, - repoGitDirPath: path.Join(currentPath, ".git"), + repoGitDirPath: filepath.Join(currentPath, ".git"), repoName: "lazygit", isBareRepo: false, } @@ -116,9 +115,9 @@ func GetRepoPathsForDir( if isSubmodule { repoPath = worktreePath } else { - repoPath = path.Dir(repoGitDirPath) + repoPath = filepath.Dir(repoGitDirPath) } - repoName := path.Base(repoPath) + repoName := filepath.Base(repoPath) return &RepoPaths{ worktreePath: worktreePath, @@ -154,7 +153,7 @@ func linkedWortkreePaths(fs afero.Fs, repoGitDirPath string) []string { result := []string{} // For each directory in this path we're going to cat the `gitdir` file and append its contents to our result // That file points us to the `.git` file in the worktree. - worktreeGitDirsPath := path.Join(repoGitDirPath, "worktrees") + worktreeGitDirsPath := filepath.Join(repoGitDirPath, "worktrees") // ensure the directory exists _, err := fs.Stat(worktreeGitDirsPath) @@ -171,7 +170,7 @@ func linkedWortkreePaths(fs afero.Fs, repoGitDirPath string) []string { return nil } - gitDirPath := path.Join(currPath, "gitdir") + gitDirPath := filepath.Join(currPath, "gitdir") gitDirBytes, err := afero.ReadFile(fs, gitDirPath) if err != nil { // ignoring error @@ -179,7 +178,7 @@ func linkedWortkreePaths(fs afero.Fs, repoGitDirPath string) []string { } trimmedGitDir := strings.TrimSpace(string(gitDirBytes)) // removing the .git part - worktreeDir := path.Dir(trimmedGitDir) + worktreeDir := filepath.Dir(trimmedGitDir) result = append(result, worktreeDir) return nil }) diff --git a/pkg/commands/git_commands/repo_paths_test.go b/pkg/commands/git_commands/repo_paths_test.go index 9ee41a3fc..77f451671 100644 --- a/pkg/commands/git_commands/repo_paths_test.go +++ b/pkg/commands/git_commands/repo_paths_test.go @@ -2,11 +2,13 @@ package git_commands import ( "fmt" + "runtime" "strings" "testing" "github.com/go-errors/errors" "github.com/jesseduffield/lazygit/pkg/commands/oscommands" + "github.com/samber/lo" "github.com/stretchr/testify/assert" ) @@ -29,7 +31,17 @@ func TestGetRepoPaths(t *testing.T) { Name: "typical case", BeforeFunc: func(runner *oscommands.FakeCmdObjRunner, getRevParseArgs argFn) { // setup for main worktree - expectedOutput := []string{ + mockOutput := lo.Ternary(runtime.GOOS == "windows", []string{ + // --show-toplevel + `C:\path\to\repo`, + // --git-dir + `C:\path\to\repo\.git`, + // --git-common-dir + `C:\path\to\repo\.git`, + // --is-bare-repository + "false", + // --show-superproject-working-tree + }, []string{ // --show-toplevel "/path/to/repo", // --git-dir @@ -39,28 +51,45 @@ func TestGetRepoPaths(t *testing.T) { // --is-bare-repository "false", // --show-superproject-working-tree - } + }) runner.ExpectGitArgs( append(getRevParseArgs(), "--show-toplevel", "--absolute-git-dir", "--git-common-dir", "--is-bare-repository", "--show-superproject-working-tree"), - strings.Join(expectedOutput, "\n"), + strings.Join(mockOutput, "\n"), nil) }, Path: "/path/to/repo", - Expected: &RepoPaths{ + Expected: lo.Ternary(runtime.GOOS == "windows", &RepoPaths{ + worktreePath: `C:\path\to\repo`, + worktreeGitDirPath: `C:\path\to\repo\.git`, + repoPath: `C:\path\to\repo`, + repoGitDirPath: `C:\path\to\repo\.git`, + repoName: `repo`, + isBareRepo: false, + }, &RepoPaths{ worktreePath: "/path/to/repo", worktreeGitDirPath: "/path/to/repo/.git", repoPath: "/path/to/repo", repoGitDirPath: "/path/to/repo/.git", repoName: "repo", isBareRepo: false, - }, + }), Err: nil, }, { Name: "bare repo", BeforeFunc: func(runner *oscommands.FakeCmdObjRunner, getRevParseArgs argFn) { // setup for main worktree - expectedOutput := []string{ + mockOutput := lo.Ternary(runtime.GOOS == "windows", []string{ + // --show-toplevel + `C:\path\to\repo`, + // --git-dir + `C:\path\to\bare_repo\bare.git`, + // --git-common-dir + `C:\path\to\bare_repo\bare.git`, + // --is-bare-repository + `true`, + // --show-superproject-working-tree + }, []string{ // --show-toplevel "/path/to/repo", // --git-dir @@ -70,27 +99,45 @@ func TestGetRepoPaths(t *testing.T) { // --is-bare-repository "true", // --show-superproject-working-tree - } + }) runner.ExpectGitArgs( append(getRevParseArgs(), "--show-toplevel", "--absolute-git-dir", "--git-common-dir", "--is-bare-repository", "--show-superproject-working-tree"), - strings.Join(expectedOutput, "\n"), + strings.Join(mockOutput, "\n"), nil) }, Path: "/path/to/repo", - Expected: &RepoPaths{ + Expected: lo.Ternary(runtime.GOOS == "windows", &RepoPaths{ + worktreePath: `C:\path\to\repo`, + worktreeGitDirPath: `C:\path\to\bare_repo\bare.git`, + repoPath: `C:\path\to\bare_repo`, + repoGitDirPath: `C:\path\to\bare_repo\bare.git`, + repoName: `bare_repo`, + isBareRepo: true, + }, &RepoPaths{ worktreePath: "/path/to/repo", worktreeGitDirPath: "/path/to/bare_repo/bare.git", repoPath: "/path/to/bare_repo", repoGitDirPath: "/path/to/bare_repo/bare.git", repoName: "bare_repo", isBareRepo: true, - }, + }), Err: nil, }, { Name: "submodule", BeforeFunc: func(runner *oscommands.FakeCmdObjRunner, getRevParseArgs argFn) { - expectedOutput := []string{ + mockOutput := lo.Ternary(runtime.GOOS == "windows", []string{ + // --show-toplevel + `C:\path\to\repo\submodule1`, + // --git-dir + `C:\path\to\repo\.git\modules\submodule1`, + // --git-common-dir + `C:\path\to\repo\.git\modules\submodule1`, + // --is-bare-repository + `false`, + // --show-superproject-working-tree + `C:\path\to\repo`, + }, []string{ // --show-toplevel "/path/to/repo/submodule1", // --git-dir @@ -101,21 +148,28 @@ func TestGetRepoPaths(t *testing.T) { "false", // --show-superproject-working-tree "/path/to/repo", - } + }) runner.ExpectGitArgs( append(getRevParseArgs(), "--show-toplevel", "--absolute-git-dir", "--git-common-dir", "--is-bare-repository", "--show-superproject-working-tree"), - strings.Join(expectedOutput, "\n"), + strings.Join(mockOutput, "\n"), nil) }, Path: "/path/to/repo/submodule1", - Expected: &RepoPaths{ + Expected: lo.Ternary(runtime.GOOS == "windows", &RepoPaths{ + worktreePath: `C:\path\to\repo\submodule1`, + worktreeGitDirPath: `C:\path\to\repo\.git\modules\submodule1`, + repoPath: `C:\path\to\repo\submodule1`, + repoGitDirPath: `C:\path\to\repo\.git\modules\submodule1`, + repoName: `submodule1`, + isBareRepo: false, + }, &RepoPaths{ worktreePath: "/path/to/repo/submodule1", worktreeGitDirPath: "/path/to/repo/.git/modules/submodule1", repoPath: "/path/to/repo/submodule1", repoGitDirPath: "/path/to/repo/.git/modules/submodule1", repoName: "submodule1", isBareRepo: false, - }, + }), Err: nil, }, { diff --git a/pkg/commands/git_commands/working_tree.go b/pkg/commands/git_commands/working_tree.go index 2364f2a68..5e3758ad5 100644 --- a/pkg/commands/git_commands/working_tree.go +++ b/pkg/commands/git_commands/working_tree.go @@ -3,7 +3,7 @@ package git_commands import ( "fmt" "os" - "path" + "path/filepath" "github.com/go-errors/errors" "github.com/jesseduffield/lazygit/pkg/commands/models" @@ -233,7 +233,7 @@ func (self *WorkingTreeCommands) Ignore(filename string) error { // Exclude adds a file to the .git/info/exclude for the repo func (self *WorkingTreeCommands) Exclude(filename string) error { - excludeFile := path.Join(self.repoPaths.repoGitDirPath, "info", "exclude") + excludeFile := filepath.Join(self.repoPaths.repoGitDirPath, "info", "exclude") return self.os.AppendLineToFile(excludeFile, filename) }