mirror of
https://github.com/jesseduffield/lazygit.git
synced 2026-09-10 15:46:26 -04:00
The cached git config runs its `git config` reads through raw exec.Command calls, outside the pinned git command builder, so they followed the process working directory. A cache miss on a stale instance — one still in use by a refresh that crossed a repo switch — would therefore read the new repo's local config while computing data for the old one. Give the cache a directory, set once by NewGitCommand right after it determines the repo paths (the object is created fresh for every repo switch, so no cross-repo cache invalidation is needed), and run every config command there. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
136 lines
3.1 KiB
Go
136 lines
3.1 KiB
Go
package git_config
|
|
|
|
import (
|
|
"os/exec"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/jesseduffield/lazygit/pkg/utils"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestGetBool(t *testing.T) {
|
|
type scenario struct {
|
|
testName string
|
|
mockResponses map[string]string
|
|
expected bool
|
|
}
|
|
|
|
scenarios := []scenario{
|
|
{
|
|
"Option global and local config commit.gpgsign is not set",
|
|
map[string]string{},
|
|
false,
|
|
},
|
|
{
|
|
"Some other random key is set",
|
|
map[string]string{"blah": "blah"},
|
|
false,
|
|
},
|
|
{
|
|
"Option commit.gpgsign is true",
|
|
map[string]string{"commit.gpgsign": "True"},
|
|
true,
|
|
},
|
|
{
|
|
"Option commit.gpgsign is on",
|
|
map[string]string{"commit.gpgsign": "ON"},
|
|
true,
|
|
},
|
|
{
|
|
"Option commit.gpgsign is yes",
|
|
map[string]string{"commit.gpgsign": "YeS"},
|
|
true,
|
|
},
|
|
{
|
|
"Option commit.gpgsign is 1",
|
|
map[string]string{"commit.gpgsign": "1"},
|
|
true,
|
|
},
|
|
}
|
|
|
|
for _, s := range scenarios {
|
|
t.Run(s.testName, func(t *testing.T) {
|
|
fake := NewFakeGitConfig(s.mockResponses)
|
|
real := NewCachedGitConfig(
|
|
func(cmd *exec.Cmd) (string, error) {
|
|
assert.Equal(t, "config --get --null commit.gpgsign", strings.Join(cmd.Args[1:], " "))
|
|
return fake.Get("commit.gpgsign"), nil
|
|
},
|
|
utils.NewDummyLog(),
|
|
)
|
|
result := real.GetBool("commit.gpgsign")
|
|
assert.Equal(t, s.expected, result)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestGet(t *testing.T) {
|
|
type scenario struct {
|
|
testName string
|
|
mockResponses map[string]string
|
|
expected string
|
|
}
|
|
|
|
scenarios := []scenario{
|
|
{
|
|
"not set",
|
|
map[string]string{},
|
|
"",
|
|
},
|
|
{
|
|
"is set",
|
|
map[string]string{"commit.gpgsign": "blah"},
|
|
"blah",
|
|
},
|
|
}
|
|
|
|
for _, s := range scenarios {
|
|
t.Run(s.testName, func(t *testing.T) {
|
|
fake := NewFakeGitConfig(s.mockResponses)
|
|
real := NewCachedGitConfig(
|
|
func(cmd *exec.Cmd) (string, error) {
|
|
assert.Equal(t, "config --get --null commit.gpgsign", strings.Join(cmd.Args[1:], " "))
|
|
return fake.Get("commit.gpgsign"), nil
|
|
},
|
|
utils.NewDummyLog(),
|
|
)
|
|
result := real.Get("commit.gpgsign")
|
|
assert.Equal(t, s.expected, result)
|
|
})
|
|
}
|
|
|
|
// verifying that the cache is used
|
|
count := 0
|
|
real := NewCachedGitConfig(
|
|
func(cmd *exec.Cmd) (string, error) {
|
|
count++
|
|
assert.Equal(t, "config --get --null commit.gpgsign", strings.Join(cmd.Args[1:], " "))
|
|
return "blah", nil
|
|
},
|
|
utils.NewDummyLog(),
|
|
)
|
|
result := real.Get("commit.gpgsign")
|
|
assert.Equal(t, "blah", result)
|
|
result = real.Get("commit.gpgsign")
|
|
assert.Equal(t, "blah", result)
|
|
assert.Equal(t, 1, count)
|
|
}
|
|
|
|
// The config commands run in the directory set by SetDir rather than in the
|
|
// process's current directory: lazygit chdirs when switching repos, and config
|
|
// reads issued for the previous repo after that must keep addressing the repo
|
|
// they were created for.
|
|
func TestSetDirPinsCommandsToDirectory(t *testing.T) {
|
|
real := NewCachedGitConfig(
|
|
func(cmd *exec.Cmd) (string, error) {
|
|
assert.Equal(t, "/path/to/repo", cmd.Dir)
|
|
return "blah", nil
|
|
},
|
|
utils.NewDummyLog(),
|
|
)
|
|
real.SetDir("/path/to/repo")
|
|
real.Get("commit.gpgsign")
|
|
real.GetGeneral("--local --get-regexp foo")
|
|
}
|