mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-04-19 12:12:42 +02:00
When pushing a branch that didn't have an upstream yet, we use the command line git push --set-upstream origin HEAD:branch-name The HEAD: part of this is too unspecific; when checking out a different branch while the push is still running, then git will set the upstream branch on the newly checked out branch, not the branch that was being pushed. This might be considered a bug in git; you might expect that it resolves HEAD at the beginning of the operation, and uses the result at the end. But we can easily work around this by explicitly supplying the real branch name instead of HEAD.
182 lines
5.0 KiB
Go
182 lines
5.0 KiB
Go
package git_commands
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/jesseduffield/gocui"
|
|
"github.com/jesseduffield/lazygit/pkg/commands/oscommands"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestSyncPush(t *testing.T) {
|
|
type scenario struct {
|
|
testName string
|
|
opts PushOpts
|
|
test func(oscommands.ICmdObj, error)
|
|
}
|
|
|
|
scenarios := []scenario{
|
|
{
|
|
testName: "Push with force disabled",
|
|
opts: PushOpts{ForceWithLease: false},
|
|
test: func(cmdObj oscommands.ICmdObj, err error) {
|
|
assert.Equal(t, cmdObj.Args(), []string{"git", "push"})
|
|
assert.NoError(t, err)
|
|
},
|
|
},
|
|
{
|
|
testName: "Push with force-with-lease enabled",
|
|
opts: PushOpts{ForceWithLease: true},
|
|
test: func(cmdObj oscommands.ICmdObj, err error) {
|
|
assert.Equal(t, cmdObj.Args(), []string{"git", "push", "--force-with-lease"})
|
|
assert.NoError(t, err)
|
|
},
|
|
},
|
|
{
|
|
testName: "Push with force enabled",
|
|
opts: PushOpts{Force: true},
|
|
test: func(cmdObj oscommands.ICmdObj, err error) {
|
|
assert.Equal(t, cmdObj.Args(), []string{"git", "push", "--force"})
|
|
assert.NoError(t, err)
|
|
},
|
|
},
|
|
{
|
|
testName: "Push with force disabled, upstream supplied",
|
|
opts: PushOpts{
|
|
ForceWithLease: false,
|
|
CurrentBranch: "master",
|
|
UpstreamRemote: "origin",
|
|
UpstreamBranch: "master",
|
|
},
|
|
test: func(cmdObj oscommands.ICmdObj, err error) {
|
|
assert.Equal(t, cmdObj.Args(), []string{"git", "push", "origin", "refs/heads/master:master"})
|
|
assert.NoError(t, err)
|
|
},
|
|
},
|
|
{
|
|
testName: "Push with force disabled, setting upstream",
|
|
opts: PushOpts{
|
|
ForceWithLease: false,
|
|
CurrentBranch: "master-local",
|
|
UpstreamRemote: "origin",
|
|
UpstreamBranch: "master",
|
|
SetUpstream: true,
|
|
},
|
|
test: func(cmdObj oscommands.ICmdObj, err error) {
|
|
assert.Equal(t, cmdObj.Args(), []string{"git", "push", "--set-upstream", "origin", "refs/heads/master-local:master"})
|
|
assert.NoError(t, err)
|
|
},
|
|
},
|
|
{
|
|
testName: "Push with force-with-lease enabled, setting upstream",
|
|
opts: PushOpts{
|
|
ForceWithLease: true,
|
|
CurrentBranch: "master",
|
|
UpstreamRemote: "origin",
|
|
UpstreamBranch: "master",
|
|
SetUpstream: true,
|
|
},
|
|
test: func(cmdObj oscommands.ICmdObj, err error) {
|
|
assert.Equal(t, cmdObj.Args(), []string{"git", "push", "--force-with-lease", "--set-upstream", "origin", "refs/heads/master:master"})
|
|
assert.NoError(t, err)
|
|
},
|
|
},
|
|
{
|
|
testName: "Push with remote branch but no origin",
|
|
opts: PushOpts{
|
|
ForceWithLease: true,
|
|
UpstreamRemote: "",
|
|
UpstreamBranch: "master",
|
|
SetUpstream: true,
|
|
},
|
|
test: func(cmdObj oscommands.ICmdObj, err error) {
|
|
assert.Error(t, err)
|
|
assert.EqualValues(t, "Must specify a remote if specifying a branch", err.Error())
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, s := range scenarios {
|
|
t.Run(s.testName, func(t *testing.T) {
|
|
instance := buildSyncCommands(commonDeps{})
|
|
task := gocui.NewFakeTask()
|
|
s.test(instance.PushCmdObj(task, s.opts))
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestSyncFetch(t *testing.T) {
|
|
type scenario struct {
|
|
testName string
|
|
fetchAllConfig bool
|
|
test func(oscommands.ICmdObj)
|
|
}
|
|
|
|
scenarios := []scenario{
|
|
{
|
|
testName: "Fetch in foreground (all=false)",
|
|
fetchAllConfig: false,
|
|
test: func(cmdObj oscommands.ICmdObj) {
|
|
assert.True(t, cmdObj.ShouldLog())
|
|
assert.Equal(t, cmdObj.GetCredentialStrategy(), oscommands.PROMPT)
|
|
assert.Equal(t, cmdObj.Args(), []string{"git", "fetch"})
|
|
},
|
|
},
|
|
{
|
|
testName: "Fetch in foreground (all=true)",
|
|
fetchAllConfig: true,
|
|
test: func(cmdObj oscommands.ICmdObj) {
|
|
assert.True(t, cmdObj.ShouldLog())
|
|
assert.Equal(t, cmdObj.GetCredentialStrategy(), oscommands.PROMPT)
|
|
assert.Equal(t, cmdObj.Args(), []string{"git", "fetch", "--all"})
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, s := range scenarios {
|
|
t.Run(s.testName, func(t *testing.T) {
|
|
instance := buildSyncCommands(commonDeps{})
|
|
instance.UserConfig().Git.FetchAll = s.fetchAllConfig
|
|
task := gocui.NewFakeTask()
|
|
s.test(instance.FetchCmdObj(task))
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestSyncFetchBackground(t *testing.T) {
|
|
type scenario struct {
|
|
testName string
|
|
fetchAllConfig bool
|
|
test func(oscommands.ICmdObj)
|
|
}
|
|
|
|
scenarios := []scenario{
|
|
{
|
|
testName: "Fetch in background (all=false)",
|
|
fetchAllConfig: false,
|
|
test: func(cmdObj oscommands.ICmdObj) {
|
|
assert.False(t, cmdObj.ShouldLog())
|
|
assert.Equal(t, cmdObj.GetCredentialStrategy(), oscommands.FAIL)
|
|
assert.Equal(t, cmdObj.Args(), []string{"git", "fetch"})
|
|
},
|
|
},
|
|
{
|
|
testName: "Fetch in background (all=true)",
|
|
fetchAllConfig: true,
|
|
test: func(cmdObj oscommands.ICmdObj) {
|
|
assert.False(t, cmdObj.ShouldLog())
|
|
assert.Equal(t, cmdObj.GetCredentialStrategy(), oscommands.FAIL)
|
|
assert.Equal(t, cmdObj.Args(), []string{"git", "fetch", "--all"})
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, s := range scenarios {
|
|
t.Run(s.testName, func(t *testing.T) {
|
|
instance := buildSyncCommands(commonDeps{})
|
|
instance.UserConfig().Git.FetchAll = s.fetchAllConfig
|
|
s.test(instance.FetchBackgroundCmdObj())
|
|
})
|
|
}
|
|
}
|