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

Refresh worktrees before auto-forwarding branches

AutoForwardBranches relies on the worktree model to skip any branch
that's currently checked out in another worktree (so we don't update
its ref behind the worktree's back). The post-fetch refresh wasn't
including the worktrees scope, so any external change to the worktree
list between lazygit's startup and the fetch — a `git worktree add`,
a `git checkout` in a linked worktree, a branch rename — left the
in-memory model stale and the skip check returned false negatives.

Add WORKTREES to the post-fetch refresh scope when auto-forwarding is
enabled. We gate on the config so users with auto-forward disabled
don't pay for an extra `git worktree list` plus per-worktree rev-parse
on every fetch tick.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Stefan Haller
2026-05-21 12:31:09 +02:00
parent 532cce4873
commit 4f6cdedb1e
2 changed files with 8 additions and 15 deletions
@@ -286,12 +286,14 @@ func (self *BranchesHelper) deleteRemoteBranches(remoteBranches []*models.Remote
} }
func (self *BranchesHelper) PostFetchRefresh(fetchErr error) error { func (self *BranchesHelper) PostFetchRefresh(fetchErr error) error {
self.c.Refresh(types.RefreshOptions{ scope := []types.RefreshableView{
Scope: []types.RefreshableView{ types.BRANCHES, types.COMMITS, types.REMOTES, types.TAGS, types.PULL_REQUESTS,
types.BRANCHES, types.COMMITS, types.REMOTES, types.TAGS, types.PULL_REQUESTS, }
}, // AutoForwardBranches needs a fresh worktree model to skip branches that are checked out elsewhere.
Mode: types.SYNC, if self.c.UserConfig().Git.AutoForwardBranches != "none" {
}) scope = append(scope, types.WORKTREES)
}
self.c.Refresh(types.RefreshOptions{Scope: scope, Mode: types.SYNC})
if fetchErr != nil { if fetchErr != nil {
return fetchErr return fetchErr
} }
@@ -43,12 +43,8 @@ var FetchAndAutoForwardBranchesWorktreeAddedAfterStartup = NewIntegrationTest(Ne
t.Views().Branches(). t.Views().Branches().
Lines( Lines(
Contains("feature").IsSelected(), Contains("feature").IsSelected(),
/* EXPECTED:
Contains("master (worktree linked-worktree) ↓1"), Contains("master (worktree linked-worktree) ↓1"),
Contains("wt-branch").DoesNotContain("worktree"), Contains("wt-branch").DoesNotContain("worktree"),
ACTUAL: */
Contains("master ✓"),
Contains("wt-branch (worktree linked-worktree)"),
) )
t.Views().Worktrees(). t.Views().Worktrees().
@@ -58,11 +54,6 @@ var FetchAndAutoForwardBranchesWorktreeAddedAfterStartup = NewIntegrationTest(Ne
t.Views().Files(). t.Views().Files().
Focus(). Focus().
/* EXPECTED:
IsEmpty() IsEmpty()
ACTUAL: */
Lines(
Equals("D file03.txt"),
)
}, },
}) })