1
0
mirror of https://github.com/jesseduffield/lazygit.git synced 2026-05-22 10:15:43 +02:00

Add test for auto-forwarding a branch checked out in another worktree

When the linked worktree's branch is changed externally — by another
shell, by another tool, or by git running outside lazygit — lazygit's
worktrees model goes stale. The next post-fetch auto-forward then
doesn't realise the branch is now checked out elsewhere, and advances
its ref behind the worktree's back. The worktree's HEAD then resolves
to a commit its index/working tree haven't been updated to, and the
user sees that diff as the inverse of what was fetched — files
appearing as pending changes that they didn't make.

The test sets up a linked worktree initially on a side branch, then
externally checks out master in it before pressing fetch. Two
EXPECTED/ACTUAL pairs capture the symptoms: the branches view shows
master as `✓` rather than `↓1`, and switching to the linked worktree
shows master's would-be incoming file as a pending deletion against
HEAD.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Stefan Haller
2026-05-21 12:30:36 +02:00
parent f032ee8b0f
commit 532cce4873
2 changed files with 69 additions and 0 deletions
@@ -0,0 +1,68 @@
package sync
import (
"github.com/jesseduffield/lazygit/pkg/config"
. "github.com/jesseduffield/lazygit/pkg/integration/components"
)
var FetchAndAutoForwardBranchesWorktreeAddedAfterStartup = NewIntegrationTest(NewIntegrationTestArgs{
Description: "Auto-forward skips a main branch that was externally checked out in a linked worktree after lazygit started",
ExtraCmdArgs: []string{},
Skip: false,
SetupConfig: func(config *config.AppConfig) {
config.GetUserConfig().Git.AutoForwardBranches = "onlyMainBranches"
config.GetUserConfig().Git.LocalBranchSortOrder = "alphabetical"
},
SetupRepo: func(shell *Shell) {
shell.CreateNCommits(3)
shell.NewBranch("feature")
shell.NewBranch("wt-branch")
shell.CloneIntoRemote("origin")
shell.SetBranchUpstream("master", "origin/master")
shell.SetBranchUpstream("feature", "origin/feature")
shell.Checkout("master")
shell.HardReset("HEAD^")
shell.Checkout("feature")
shell.AddWorktreeCheckout("wt-branch", "../linked-worktree")
},
Run: func(t *TestDriver, keys config.KeybindingConfig) {
t.Views().Branches().
Lines(
Contains("feature").IsSelected(),
Contains("master ↓1").DoesNotContain("↑"),
Contains("wt-branch (worktree linked-worktree)"),
)
// Switch the linked worktree to master externally.
t.Shell().RunCommand([]string{"git", "-C", "../linked-worktree", "checkout", "master"})
t.Views().Files().
IsFocused().
Press(keys.Files.Fetch)
t.Views().Branches().
Lines(
Contains("feature").IsSelected(),
/* EXPECTED:
Contains("master (worktree linked-worktree) ↓1"),
Contains("wt-branch").DoesNotContain("worktree"),
ACTUAL: */
Contains("master ✓"),
Contains("wt-branch (worktree linked-worktree)"),
)
t.Views().Worktrees().
Focus().
NavigateToLine(Contains("linked-worktree")).
PressPrimaryAction()
t.Views().Files().
Focus().
/* EXPECTED:
IsEmpty()
ACTUAL: */
Lines(
Equals("D file03.txt"),
)
},
})
+1
View File
@@ -428,6 +428,7 @@ var tests = []*components.IntegrationTest{
sync.FetchAndAutoForwardBranchesAllBranchesCheckedOutInOtherWorktree,
sync.FetchAndAutoForwardBranchesNone,
sync.FetchAndAutoForwardBranchesOnlyMainBranches,
sync.FetchAndAutoForwardBranchesWorktreeAddedAfterStartup,
sync.FetchPrune,
sync.FetchWhenSortedByDate,
sync.ForcePush,