summaryrefslogtreecommitdiffstats
path: root/pkg/integration
diff options
context:
space:
mode:
authorStefan Haller <stefan@haller-berlin.de>2024-05-17 21:07:38 +0200
committerStefan Haller <stefan@haller-berlin.de>2024-05-19 09:44:38 +0200
commitb91b40ba4d8d969d92228829481c2b517aa124d2 (patch)
tree7aa375136e11ae3642dad85b39bfb764e4a496b2 /pkg/integration
parentc4927e21c560c98b147ee3e9912366e69b113011 (diff)
Add test demonstrating the problem with force-pushing in a triangular workflow
Our code doesn't realize that we need to prompt the user to force push, when the branch is up-to-date with its upstream but not with the branch that we're pushing to.
Diffstat (limited to 'pkg/integration')
-rw-r--r--pkg/integration/components/shell.go4
-rw-r--r--pkg/integration/tests/sync/force_push_triangular.go72
-rw-r--r--pkg/integration/tests/test_list.go1
3 files changed, 77 insertions, 0 deletions
diff --git a/pkg/integration/components/shell.go b/pkg/integration/components/shell.go
index 8d18361fb..a8caff77d 100644
--- a/pkg/integration/components/shell.go
+++ b/pkg/integration/components/shell.go
@@ -194,6 +194,10 @@ func (self *Shell) CreateAnnotatedTag(name string, message string, ref string) *
return self.RunCommand([]string{"git", "tag", "-a", name, "-m", message, ref})
}
+func (self *Shell) PushBranch(upstream, branch string) *Shell {
+ return self.RunCommand([]string{"git", "push", upstream, branch})
+}
+
func (self *Shell) PushBranchAndSetUpstream(upstream, branch string) *Shell {
return self.RunCommand([]string{"git", "push", "--set-upstream", upstream, branch})
}
diff --git a/pkg/integration/tests/sync/force_push_triangular.go b/pkg/integration/tests/sync/force_push_triangular.go
new file mode 100644
index 000000000..379912f6c
--- /dev/null
+++ b/pkg/integration/tests/sync/force_push_triangular.go
@@ -0,0 +1,72 @@
+package sync
+
+import (
+ "github.com/jesseduffield/lazygit/pkg/config"
+ . "github.com/jesseduffield/lazygit/pkg/integration/components"
+)
+
+var ForcePushTriangular = NewIntegrationTest(NewIntegrationTestArgs{
+ Description: "Push to a remote, requiring a force push because the branch is behind the remote push branch but not the upstream",
+ ExtraCmdArgs: []string{},
+ Skip: false,
+ GitVersion: AtLeast("2.22.0"),
+ SetupConfig: func(config *config.AppConfig) {},
+ SetupRepo: func(shell *Shell) {
+ shell.SetConfig("push.default", "current")
+
+ shell.EmptyCommit("one")
+
+ shell.CloneIntoRemote("origin")
+
+ shell.NewBranch("feature")
+ shell.SetBranchUpstream("feature", "origin/master")
+ shell.EmptyCommit("two")
+ shell.PushBranch("origin", "feature")
+
+ // remove the 'two' commit so that we are behind the push branch
+ shell.HardReset("HEAD^")
+ },
+ Run: func(t *TestDriver, keys config.KeybindingConfig) {
+ t.Views().Commits().
+ Lines(
+ Contains("one"),
+ )
+
+ t.Views().Status().Content(Contains("✓ repo → feature"))
+
+ t.Views().Files().IsFocused().Press(keys.Universal.Push)
+
+ // This results in an attempt to push normally, which fails with an error:
+ t.ExpectPopup().Alert().
+ Title(Equals("Error")).
+ Content(Contains("Updates were rejected. Please fetch and examine the remote changes before pushing again."))
+
+ /* EXPECTED:
+ t.ExpectPopup().Confirmation().
+ Title(Equals("Force push")).
+ Content(Equals("Your branch has diverged from the remote branch. Press <esc> to cancel, or <enter> to force push.")).
+ Confirm()
+
+ t.Views().Commits().
+ Lines(
+ Contains("one"),
+ )
+
+ t.Views().Status().Content(Contains("✓ repo → feature"))
+
+ t.Views().Remotes().Focus().
+ Lines(Contains("origin")).
+ PressEnter()
+
+ t.Views().RemoteBranches().IsFocused().
+ Lines(
+ Contains("feature"),
+ Contains("master"),
+ ).
+ PressEnter()
+
+ t.Views().SubCommits().IsFocused().
+ Lines(Contains("one"))
+ */
+ },
+})
diff --git a/pkg/integration/tests/test_list.go b/pkg/integration/tests/test_list.go
index 7084fd99b..e043d4a8a 100644
--- a/pkg/integration/tests/test_list.go
+++ b/pkg/integration/tests/test_list.go
@@ -275,6 +275,7 @@ var tests = []*components.IntegrationTest{
sync.ForcePush,
sync.ForcePushMultipleMatching,
sync.ForcePushMultipleUpstream,
+ sync.ForcePushTriangular,
sync.Pull,
sync.PullAndSetUpstream,
sync.PullMerge,