2022-01-08 05:00:36 +02:00
|
|
|
package git_commands
|
2021-04-10 03:40:42 +02:00
|
|
|
|
|
|
|
import (
|
|
|
|
"testing"
|
|
|
|
|
2021-12-30 08:19:01 +02:00
|
|
|
"github.com/go-errors/errors"
|
|
|
|
"github.com/jesseduffield/lazygit/pkg/commands/oscommands"
|
2023-05-20 08:55:07 +02:00
|
|
|
"github.com/jesseduffield/lazygit/pkg/config"
|
2021-04-10 03:40:42 +02:00
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
)
|
|
|
|
|
2022-01-08 04:22:29 +02:00
|
|
|
func TestBranchGetCommitDifferences(t *testing.T) {
|
2021-04-10 03:40:42 +02:00
|
|
|
type scenario struct {
|
2021-12-30 08:19:01 +02:00
|
|
|
testName string
|
|
|
|
runner *oscommands.FakeCmdObjRunner
|
|
|
|
expectedPushables string
|
|
|
|
expectedPullables string
|
2021-04-10 03:40:42 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
scenarios := []scenario{
|
|
|
|
{
|
|
|
|
"Can't retrieve pushable count",
|
2021-12-30 08:19:01 +02:00
|
|
|
oscommands.NewFakeRunner(t).
|
|
|
|
Expect("git rev-list @{u}..HEAD --count", "", errors.New("error")),
|
|
|
|
"?", "?",
|
2021-04-10 03:40:42 +02:00
|
|
|
},
|
|
|
|
{
|
|
|
|
"Can't retrieve pullable count",
|
2021-12-30 08:19:01 +02:00
|
|
|
oscommands.NewFakeRunner(t).
|
|
|
|
Expect("git rev-list @{u}..HEAD --count", "1\n", nil).
|
|
|
|
Expect("git rev-list HEAD..@{u} --count", "", errors.New("error")),
|
|
|
|
"?", "?",
|
2021-04-10 03:40:42 +02:00
|
|
|
},
|
|
|
|
{
|
|
|
|
"Retrieve pullable and pushable count",
|
2021-12-30 08:19:01 +02:00
|
|
|
oscommands.NewFakeRunner(t).
|
|
|
|
Expect("git rev-list @{u}..HEAD --count", "1\n", nil).
|
|
|
|
Expect("git rev-list HEAD..@{u} --count", "2\n", nil),
|
|
|
|
"1", "2",
|
2021-04-10 03:40:42 +02:00
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, s := range scenarios {
|
2022-01-08 06:46:35 +02:00
|
|
|
s := s
|
2021-04-10 03:40:42 +02:00
|
|
|
t.Run(s.testName, func(t *testing.T) {
|
2022-01-18 12:26:21 +02:00
|
|
|
instance := buildBranchCommands(commonDeps{runner: s.runner})
|
2022-01-08 04:22:29 +02:00
|
|
|
pushables, pullables := instance.GetCommitDifferences("HEAD", "@{u}")
|
2021-12-30 08:19:01 +02:00
|
|
|
assert.EqualValues(t, s.expectedPushables, pushables)
|
|
|
|
assert.EqualValues(t, s.expectedPullables, pullables)
|
|
|
|
s.runner.CheckForMissingCalls()
|
2021-04-10 03:40:42 +02:00
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-01-08 04:22:29 +02:00
|
|
|
func TestBranchNewBranch(t *testing.T) {
|
2021-12-30 08:19:01 +02:00
|
|
|
runner := oscommands.NewFakeRunner(t).
|
2022-10-16 14:31:42 +02:00
|
|
|
Expect(`git checkout -b "test" "refs/heads/master"`, "", nil)
|
2022-01-18 12:26:21 +02:00
|
|
|
instance := buildBranchCommands(commonDeps{runner: runner})
|
2021-04-10 03:40:42 +02:00
|
|
|
|
2022-10-16 14:31:42 +02:00
|
|
|
assert.NoError(t, instance.New("test", "refs/heads/master"))
|
2021-12-30 08:19:01 +02:00
|
|
|
runner.CheckForMissingCalls()
|
2021-04-10 03:40:42 +02:00
|
|
|
}
|
|
|
|
|
2022-01-08 04:22:29 +02:00
|
|
|
func TestBranchDeleteBranch(t *testing.T) {
|
2021-04-10 03:40:42 +02:00
|
|
|
type scenario struct {
|
|
|
|
testName string
|
|
|
|
force bool
|
2021-12-30 08:19:01 +02:00
|
|
|
runner *oscommands.FakeCmdObjRunner
|
2021-04-10 03:40:42 +02:00
|
|
|
test func(error)
|
|
|
|
}
|
|
|
|
|
|
|
|
scenarios := []scenario{
|
|
|
|
{
|
|
|
|
"Delete a branch",
|
|
|
|
false,
|
2021-12-30 08:19:01 +02:00
|
|
|
oscommands.NewFakeRunner(t).Expect(`git branch -d "test"`, "", nil),
|
2021-04-10 03:40:42 +02:00
|
|
|
func(err error) {
|
|
|
|
assert.NoError(t, err)
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"Force delete a branch",
|
|
|
|
true,
|
2021-12-30 08:19:01 +02:00
|
|
|
oscommands.NewFakeRunner(t).Expect(`git branch -D "test"`, "", nil),
|
2021-04-10 03:40:42 +02:00
|
|
|
func(err error) {
|
|
|
|
assert.NoError(t, err)
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, s := range scenarios {
|
2022-01-08 06:46:35 +02:00
|
|
|
s := s
|
2021-04-10 03:40:42 +02:00
|
|
|
t.Run(s.testName, func(t *testing.T) {
|
2022-01-18 12:26:21 +02:00
|
|
|
instance := buildBranchCommands(commonDeps{runner: s.runner})
|
2021-12-30 08:19:01 +02:00
|
|
|
|
2022-01-08 04:22:29 +02:00
|
|
|
s.test(instance.Delete("test", s.force))
|
2021-12-30 08:19:01 +02:00
|
|
|
s.runner.CheckForMissingCalls()
|
2021-04-10 03:40:42 +02:00
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-01-08 04:22:29 +02:00
|
|
|
func TestBranchMerge(t *testing.T) {
|
2023-05-20 08:55:07 +02:00
|
|
|
scenarios := []struct {
|
|
|
|
testName string
|
|
|
|
userConfig *config.UserConfig
|
|
|
|
opts MergeOpts
|
|
|
|
branchName string
|
|
|
|
expected string
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
testName: "basic",
|
|
|
|
userConfig: &config.UserConfig{},
|
|
|
|
opts: MergeOpts{},
|
|
|
|
branchName: "mybranch",
|
|
|
|
expected: `git merge --no-edit "mybranch"`,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
testName: "merging args",
|
|
|
|
userConfig: &config.UserConfig{
|
|
|
|
Git: config.GitConfig{
|
|
|
|
Merging: config.MergingConfig{
|
|
|
|
Args: "--merging-args", // it's up to the user what they put here
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
opts: MergeOpts{},
|
|
|
|
branchName: "mybranch",
|
|
|
|
expected: `git merge --no-edit --merging-args "mybranch"`,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
testName: "fast forward only",
|
|
|
|
userConfig: &config.UserConfig{},
|
|
|
|
opts: MergeOpts{FastForwardOnly: true},
|
|
|
|
branchName: "mybranch",
|
|
|
|
expected: `git merge --no-edit --ff-only "mybranch"`,
|
|
|
|
},
|
|
|
|
}
|
2021-04-10 03:40:42 +02:00
|
|
|
|
2023-05-20 08:55:07 +02:00
|
|
|
for _, s := range scenarios {
|
|
|
|
s := s
|
|
|
|
t.Run(s.testName, func(t *testing.T) {
|
|
|
|
runner := oscommands.NewFakeRunner(t).
|
|
|
|
Expect(s.expected, "", nil)
|
|
|
|
instance := buildBranchCommands(commonDeps{runner: runner, userConfig: s.userConfig})
|
|
|
|
|
|
|
|
assert.NoError(t, instance.Merge(s.branchName, s.opts))
|
|
|
|
runner.CheckForMissingCalls()
|
|
|
|
})
|
|
|
|
}
|
2021-04-10 03:40:42 +02:00
|
|
|
}
|
|
|
|
|
2022-01-08 04:22:29 +02:00
|
|
|
func TestBranchCheckout(t *testing.T) {
|
2021-04-10 03:40:42 +02:00
|
|
|
type scenario struct {
|
|
|
|
testName string
|
2021-12-30 08:19:01 +02:00
|
|
|
runner *oscommands.FakeCmdObjRunner
|
2021-04-10 03:40:42 +02:00
|
|
|
test func(error)
|
|
|
|
force bool
|
|
|
|
}
|
|
|
|
|
|
|
|
scenarios := []scenario{
|
|
|
|
{
|
|
|
|
"Checkout",
|
2021-12-30 08:19:01 +02:00
|
|
|
oscommands.NewFakeRunner(t).Expect(`git checkout "test"`, "", nil),
|
2021-04-10 03:40:42 +02:00
|
|
|
func(err error) {
|
|
|
|
assert.NoError(t, err)
|
|
|
|
},
|
|
|
|
false,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"Checkout forced",
|
2021-12-30 08:19:01 +02:00
|
|
|
oscommands.NewFakeRunner(t).Expect(`git checkout --force "test"`, "", nil),
|
2021-04-10 03:40:42 +02:00
|
|
|
func(err error) {
|
|
|
|
assert.NoError(t, err)
|
|
|
|
},
|
|
|
|
true,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, s := range scenarios {
|
2022-01-08 06:46:35 +02:00
|
|
|
s := s
|
2021-04-10 03:40:42 +02:00
|
|
|
t.Run(s.testName, func(t *testing.T) {
|
2022-01-18 12:26:21 +02:00
|
|
|
instance := buildBranchCommands(commonDeps{runner: s.runner})
|
2022-01-08 04:22:29 +02:00
|
|
|
s.test(instance.Checkout("test", CheckoutOptions{Force: s.force}))
|
2021-12-30 08:19:01 +02:00
|
|
|
s.runner.CheckForMissingCalls()
|
2021-04-10 03:40:42 +02:00
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-01-08 04:22:29 +02:00
|
|
|
func TestBranchGetBranchGraph(t *testing.T) {
|
2022-01-03 06:15:26 +02:00
|
|
|
runner := oscommands.NewFakeRunner(t).ExpectGitArgs([]string{
|
|
|
|
"log", "--graph", "--color=always", "--abbrev-commit", "--decorate", "--date=relative", "--pretty=medium", "test", "--",
|
2021-12-30 08:19:01 +02:00
|
|
|
}, "", nil)
|
2022-01-18 12:26:21 +02:00
|
|
|
instance := buildBranchCommands(commonDeps{runner: runner})
|
2022-01-08 04:22:29 +02:00
|
|
|
_, err := instance.GetGraph("test")
|
2021-04-10 03:40:42 +02:00
|
|
|
assert.NoError(t, err)
|
|
|
|
}
|
|
|
|
|
2022-01-08 04:22:29 +02:00
|
|
|
func TestBranchGetAllBranchGraph(t *testing.T) {
|
2022-01-03 06:15:26 +02:00
|
|
|
runner := oscommands.NewFakeRunner(t).ExpectGitArgs([]string{
|
|
|
|
"log", "--graph", "--all", "--color=always", "--abbrev-commit", "--decorate", "--date=relative", "--pretty=medium",
|
2021-12-30 08:19:01 +02:00
|
|
|
}, "", nil)
|
2022-01-18 12:26:21 +02:00
|
|
|
instance := buildBranchCommands(commonDeps{runner: runner})
|
2022-01-08 04:22:29 +02:00
|
|
|
err := instance.AllBranchesLogCmdObj().Run()
|
2021-04-10 03:40:42 +02:00
|
|
|
assert.NoError(t, err)
|
|
|
|
}
|
|
|
|
|
2022-10-16 14:31:42 +02:00
|
|
|
func TestBranchCurrentBranchInfo(t *testing.T) {
|
2021-04-10 03:40:42 +02:00
|
|
|
type scenario struct {
|
|
|
|
testName string
|
2021-12-30 08:19:01 +02:00
|
|
|
runner *oscommands.FakeCmdObjRunner
|
2022-10-16 14:31:42 +02:00
|
|
|
test func(BranchInfo, error)
|
2021-04-10 03:40:42 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
scenarios := []scenario{
|
|
|
|
{
|
|
|
|
"says we are on the master branch if we are",
|
2021-12-30 08:19:01 +02:00
|
|
|
oscommands.NewFakeRunner(t).Expect(`git symbolic-ref --short HEAD`, "master", nil),
|
2022-10-16 14:31:42 +02:00
|
|
|
func(info BranchInfo, err error) {
|
2021-04-10 03:40:42 +02:00
|
|
|
assert.NoError(t, err)
|
2022-10-16 14:31:42 +02:00
|
|
|
assert.EqualValues(t, "master", info.RefName)
|
|
|
|
assert.EqualValues(t, "master", info.DisplayName)
|
|
|
|
assert.False(t, info.DetachedHead)
|
2021-04-10 03:40:42 +02:00
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
2023-01-27 13:14:03 +02:00
|
|
|
"falls back to git `git branch --points-at=HEAD` if symbolic-ref fails",
|
2021-12-30 08:19:01 +02:00
|
|
|
oscommands.NewFakeRunner(t).
|
|
|
|
Expect(`git symbolic-ref --short HEAD`, "", errors.New("error")).
|
2023-01-27 13:14:03 +02:00
|
|
|
Expect(`git branch --points-at=HEAD --format="%(HEAD)%00%(objectname)%00%(refname)"`, "*\x006f71c57a8d4bd6c11399c3f55f42c815527a73a4\x00(HEAD detached at 6f71c57a)\n", nil),
|
2022-10-16 14:31:42 +02:00
|
|
|
func(info BranchInfo, err error) {
|
2021-04-10 03:40:42 +02:00
|
|
|
assert.NoError(t, err)
|
2023-01-27 13:14:03 +02:00
|
|
|
assert.EqualValues(t, "6f71c57a8d4bd6c11399c3f55f42c815527a73a4", info.RefName)
|
|
|
|
assert.EqualValues(t, "(HEAD detached at 6f71c57a)", info.DisplayName)
|
2022-10-16 14:31:42 +02:00
|
|
|
assert.True(t, info.DetachedHead)
|
2021-04-10 03:40:42 +02:00
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
2023-01-27 13:14:03 +02:00
|
|
|
"handles a detached head (LANG=zh_CN.UTF-8)",
|
2021-12-30 08:19:01 +02:00
|
|
|
oscommands.NewFakeRunner(t).
|
|
|
|
Expect(`git symbolic-ref --short HEAD`, "", errors.New("error")).
|
2023-01-27 13:14:03 +02:00
|
|
|
Expect(
|
|
|
|
`git branch --points-at=HEAD --format="%(HEAD)%00%(objectname)%00%(refname)"`,
|
|
|
|
"*\x00679b0456f3db7c505b398def84e7d023e5b55a8d\x00(头指针在 679b0456 分离)\n"+
|
|
|
|
" \x00679b0456f3db7c505b398def84e7d023e5b55a8d\x00refs/heads/master\n",
|
|
|
|
nil),
|
2022-10-16 14:31:42 +02:00
|
|
|
func(info BranchInfo, err error) {
|
2021-04-10 03:40:42 +02:00
|
|
|
assert.NoError(t, err)
|
2023-01-27 13:14:03 +02:00
|
|
|
assert.EqualValues(t, "679b0456f3db7c505b398def84e7d023e5b55a8d", info.RefName)
|
|
|
|
assert.EqualValues(t, "(头指针在 679b0456 分离)", info.DisplayName)
|
2022-10-16 14:31:42 +02:00
|
|
|
assert.True(t, info.DetachedHead)
|
2021-04-10 03:40:42 +02:00
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"bubbles up error if there is one",
|
2021-12-30 08:19:01 +02:00
|
|
|
oscommands.NewFakeRunner(t).
|
|
|
|
Expect(`git symbolic-ref --short HEAD`, "", errors.New("error")).
|
2023-01-27 13:14:03 +02:00
|
|
|
Expect(`git branch --points-at=HEAD --format="%(HEAD)%00%(objectname)%00%(refname)"`, "", errors.New("error")),
|
2022-10-16 14:31:42 +02:00
|
|
|
func(info BranchInfo, err error) {
|
2021-04-10 03:40:42 +02:00
|
|
|
assert.Error(t, err)
|
2022-10-16 14:31:42 +02:00
|
|
|
assert.EqualValues(t, "", info.RefName)
|
|
|
|
assert.EqualValues(t, "", info.DisplayName)
|
|
|
|
assert.False(t, info.DetachedHead)
|
2021-04-10 03:40:42 +02:00
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, s := range scenarios {
|
2022-01-08 06:46:35 +02:00
|
|
|
s := s
|
2021-04-10 03:40:42 +02:00
|
|
|
t.Run(s.testName, func(t *testing.T) {
|
2022-01-18 12:26:21 +02:00
|
|
|
instance := buildBranchCommands(commonDeps{runner: s.runner})
|
2022-10-16 14:31:42 +02:00
|
|
|
s.test(instance.CurrentBranchInfo())
|
2021-12-30 08:19:01 +02:00
|
|
|
s.runner.CheckForMissingCalls()
|
2021-04-10 03:40:42 +02:00
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|