mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-03-19 21:28:28 +02:00
This changes GetRepoPaths() to pull information from `git rev-parse` instead of effectively reimplementing git's logic for pathfinding. This change fixes issues with bare repos, esp. versioned homedir use cases, by aligning lazygit's path handling to what git itself does. This change also enables lazygit to run from arbitrary subdirectories of a repository, including correct handling of symlinks, including "deep" symlinks into a repo, worktree, a repo's submodules, etc. Integration tests are now resilient against unintended side effects from the host's environment variables. Of necessity, $PATH and $TERM are the only env vars allowed through now.
197 lines
5.7 KiB
Go
197 lines
5.7 KiB
Go
package git_commands
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/jesseduffield/lazygit/pkg/commands/oscommands"
|
|
"github.com/jesseduffield/lazygit/pkg/config"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestStashDrop(t *testing.T) {
|
|
runner := oscommands.NewFakeRunner(t).
|
|
ExpectGitArgs([]string{"stash", "drop", "stash@{1}"}, "Dropped refs/stash@{1} (98e9cca532c37c766107093010c72e26f2c24c04)\n", nil)
|
|
instance := buildStashCommands(commonDeps{runner: runner})
|
|
|
|
assert.NoError(t, instance.Drop(1))
|
|
runner.CheckForMissingCalls()
|
|
}
|
|
|
|
func TestStashApply(t *testing.T) {
|
|
runner := oscommands.NewFakeRunner(t).
|
|
ExpectGitArgs([]string{"stash", "apply", "stash@{1}"}, "", nil)
|
|
instance := buildStashCommands(commonDeps{runner: runner})
|
|
|
|
assert.NoError(t, instance.Apply(1))
|
|
runner.CheckForMissingCalls()
|
|
}
|
|
|
|
func TestStashPop(t *testing.T) {
|
|
runner := oscommands.NewFakeRunner(t).
|
|
ExpectGitArgs([]string{"stash", "pop", "stash@{1}"}, "", nil)
|
|
instance := buildStashCommands(commonDeps{runner: runner})
|
|
|
|
assert.NoError(t, instance.Pop(1))
|
|
runner.CheckForMissingCalls()
|
|
}
|
|
|
|
func TestStashSave(t *testing.T) {
|
|
runner := oscommands.NewFakeRunner(t).
|
|
ExpectGitArgs([]string{"stash", "push", "-m", "A stash message"}, "", nil)
|
|
instance := buildStashCommands(commonDeps{runner: runner})
|
|
|
|
assert.NoError(t, instance.Push("A stash message"))
|
|
runner.CheckForMissingCalls()
|
|
}
|
|
|
|
func TestStashStore(t *testing.T) {
|
|
type scenario struct {
|
|
testName string
|
|
sha string
|
|
message string
|
|
expected []string
|
|
}
|
|
|
|
scenarios := []scenario{
|
|
{
|
|
testName: "Non-empty message",
|
|
sha: "0123456789abcdef",
|
|
message: "New stash name",
|
|
expected: []string{"stash", "store", "-m", "New stash name", "0123456789abcdef"},
|
|
},
|
|
{
|
|
testName: "Empty message",
|
|
sha: "0123456789abcdef",
|
|
message: "",
|
|
expected: []string{"stash", "store", "0123456789abcdef"},
|
|
},
|
|
{
|
|
testName: "Space message",
|
|
sha: "0123456789abcdef",
|
|
message: " ",
|
|
expected: []string{"stash", "store", "0123456789abcdef"},
|
|
},
|
|
}
|
|
|
|
for _, s := range scenarios {
|
|
s := s
|
|
t.Run(s.testName, func(t *testing.T) {
|
|
runner := oscommands.NewFakeRunner(t).
|
|
ExpectGitArgs(s.expected, "", nil)
|
|
instance := buildStashCommands(commonDeps{runner: runner})
|
|
|
|
assert.NoError(t, instance.Store(s.sha, s.message))
|
|
runner.CheckForMissingCalls()
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestStashSha(t *testing.T) {
|
|
runner := oscommands.NewFakeRunner(t).
|
|
ExpectGitArgs([]string{"rev-parse", "refs/stash@{5}"}, "14d94495194651adfd5f070590df566c11d28243\n", nil)
|
|
instance := buildStashCommands(commonDeps{runner: runner})
|
|
|
|
sha, err := instance.Sha(5)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, "14d94495194651adfd5f070590df566c11d28243", sha)
|
|
runner.CheckForMissingCalls()
|
|
}
|
|
|
|
func TestStashStashEntryCmdObj(t *testing.T) {
|
|
type scenario struct {
|
|
testName string
|
|
index int
|
|
contextSize int
|
|
ignoreWhitespace bool
|
|
expected []string
|
|
}
|
|
|
|
scenarios := []scenario{
|
|
{
|
|
testName: "Default case",
|
|
index: 5,
|
|
contextSize: 3,
|
|
ignoreWhitespace: false,
|
|
expected: []string{"git", "-C", "/path/to/worktree", "stash", "show", "-p", "--stat", "--color=always", "--unified=3", "stash@{5}"},
|
|
},
|
|
{
|
|
testName: "Show diff with custom context size",
|
|
index: 5,
|
|
contextSize: 77,
|
|
ignoreWhitespace: false,
|
|
expected: []string{"git", "-C", "/path/to/worktree", "stash", "show", "-p", "--stat", "--color=always", "--unified=77", "stash@{5}"},
|
|
},
|
|
{
|
|
testName: "Default case",
|
|
index: 5,
|
|
contextSize: 3,
|
|
ignoreWhitespace: true,
|
|
expected: []string{"git", "-C", "/path/to/worktree", "stash", "show", "-p", "--stat", "--color=always", "--unified=3", "--ignore-all-space", "stash@{5}"},
|
|
},
|
|
}
|
|
|
|
for _, s := range scenarios {
|
|
s := s
|
|
t.Run(s.testName, func(t *testing.T) {
|
|
userConfig := config.GetDefaultConfig()
|
|
appState := &config.AppState{}
|
|
appState.IgnoreWhitespaceInDiffView = s.ignoreWhitespace
|
|
appState.DiffContextSize = s.contextSize
|
|
repoPaths := RepoPaths{
|
|
worktreePath: "/path/to/worktree",
|
|
}
|
|
instance := buildStashCommands(commonDeps{userConfig: userConfig, appState: appState, repoPaths: &repoPaths})
|
|
|
|
cmdStr := instance.ShowStashEntryCmdObj(s.index).Args()
|
|
assert.Equal(t, s.expected, cmdStr)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestStashRename(t *testing.T) {
|
|
type scenario struct {
|
|
testName string
|
|
index int
|
|
message string
|
|
expectedShaCmd []string
|
|
shaResult string
|
|
expectedDropCmd []string
|
|
expectedStoreCmd []string
|
|
}
|
|
|
|
scenarios := []scenario{
|
|
{
|
|
testName: "Default case",
|
|
index: 3,
|
|
message: "New message",
|
|
expectedShaCmd: []string{"rev-parse", "refs/stash@{3}"},
|
|
shaResult: "f0d0f20f2f61ffd6d6bfe0752deffa38845a3edd\n",
|
|
expectedDropCmd: []string{"stash", "drop", "stash@{3}"},
|
|
expectedStoreCmd: []string{"stash", "store", "-m", "New message", "f0d0f20f2f61ffd6d6bfe0752deffa38845a3edd"},
|
|
},
|
|
{
|
|
testName: "Empty message",
|
|
index: 4,
|
|
message: "",
|
|
expectedShaCmd: []string{"rev-parse", "refs/stash@{4}"},
|
|
shaResult: "f0d0f20f2f61ffd6d6bfe0752deffa38845a3edd\n",
|
|
expectedDropCmd: []string{"stash", "drop", "stash@{4}"},
|
|
expectedStoreCmd: []string{"stash", "store", "f0d0f20f2f61ffd6d6bfe0752deffa38845a3edd"},
|
|
},
|
|
}
|
|
|
|
for _, s := range scenarios {
|
|
s := s
|
|
t.Run(s.testName, func(t *testing.T) {
|
|
runner := oscommands.NewFakeRunner(t).
|
|
ExpectGitArgs(s.expectedShaCmd, s.shaResult, nil).
|
|
ExpectGitArgs(s.expectedDropCmd, "", nil).
|
|
ExpectGitArgs(s.expectedStoreCmd, "", nil)
|
|
instance := buildStashCommands(commonDeps{runner: runner})
|
|
|
|
err := instance.Rename(s.index, s.message)
|
|
assert.NoError(t, err)
|
|
})
|
|
}
|
|
}
|