diff --git a/pkg/gui/controllers/helpers/branches_helper.go b/pkg/gui/controllers/helpers/branches_helper.go index 8760c4366..5566dc40c 100644 --- a/pkg/gui/controllers/helpers/branches_helper.go +++ b/pkg/gui/controllers/helpers/branches_helper.go @@ -283,7 +283,9 @@ func (self *BranchesHelper) AutoForwardBranches() error { updateCommands := "" // The first branch is the currently checked out branch; skip it for _, branch := range branches[1:] { - if branch.RemoteBranchStoredLocally() && (allBranches || lo.Contains(self.c.UserConfig().Git.MainBranches, branch.Name)) { + if branch.RemoteBranchStoredLocally() && + !self.checkedOutByOtherWorktree(branch) && + (allBranches || lo.Contains(self.c.UserConfig().Git.MainBranches, branch.Name)) { isStrictlyBehind := branch.IsBehindForPull() && !branch.IsAheadForPull() if isStrictlyBehind { updateCommands += fmt.Sprintf("update %s %s %s\n", branch.FullRefName(), branch.FullUpstreamRefName(), branch.CommitHash) diff --git a/pkg/integration/tests/sync/fetch_and_auto_forward_branches_all_branches_checked_out_in_other_worktree.go b/pkg/integration/tests/sync/fetch_and_auto_forward_branches_all_branches_checked_out_in_other_worktree.go new file mode 100644 index 000000000..bc1ecd294 --- /dev/null +++ b/pkg/integration/tests/sync/fetch_and_auto_forward_branches_all_branches_checked_out_in_other_worktree.go @@ -0,0 +1,57 @@ +package sync + +import ( + "github.com/jesseduffield/lazygit/pkg/config" + . "github.com/jesseduffield/lazygit/pkg/integration/components" +) + +var FetchAndAutoForwardBranchesAllBranchesCheckedOutInOtherWorktree = NewIntegrationTest(NewIntegrationTestArgs{ + Description: "Fetch from remote and auto-forward branches with config set to 'allBranches'; check that this skips branches checked out by another worktree", + ExtraCmdArgs: []string{}, + Skip: false, + SetupConfig: func(config *config.AppConfig) { + config.GetUserConfig().Git.AutoForwardBranches = "allBranches" + config.GetUserConfig().Git.LocalBranchSortOrder = "alphabetical" + }, + SetupRepo: func(shell *Shell) { + shell.CreateNCommits(3) + shell.NewBranch("feature") + shell.NewBranch("diverged") + shell.CloneIntoRemote("origin") + shell.SetBranchUpstream("master", "origin/master") + shell.SetBranchUpstream("feature", "origin/feature") + shell.SetBranchUpstream("diverged", "origin/diverged") + shell.Checkout("master") + shell.HardReset("HEAD^") + shell.Checkout("feature") + shell.HardReset("HEAD~2") + shell.Checkout("diverged") + shell.HardReset("HEAD~2") + shell.EmptyCommit("local") + shell.NewBranch("checked-out") + + shell.AddWorktreeCheckout("master", "../linked-worktree") + }, + Run: func(t *TestDriver, keys config.KeybindingConfig) { + t.Views().Branches(). + Lines( + Contains("checked-out").IsSelected(), + Contains("diverged ↓2↑1"), + Contains("feature ↓2").DoesNotContain("↑"), + Contains("master (worktree) ↓1").DoesNotContain("↑"), + ) + + t.Views().Files(). + IsFocused(). + Press(keys.Files.Fetch) + + // AutoForwardBranches is "allBranches": both master and feature get forwarded + t.Views().Branches(). + Lines( + Contains("checked-out").IsSelected(), + Contains("diverged ↓2↑1"), + Contains("feature ✓"), + Contains("master (worktree) ↓1"), + ) + }, +}) diff --git a/pkg/integration/tests/test_list.go b/pkg/integration/tests/test_list.go index 3fc314d10..bd352d38e 100644 --- a/pkg/integration/tests/test_list.go +++ b/pkg/integration/tests/test_list.go @@ -383,6 +383,7 @@ var tests = []*components.IntegrationTest{ submodule.Reset, submodule.ResetFolder, sync.FetchAndAutoForwardBranchesAllBranches, + sync.FetchAndAutoForwardBranchesAllBranchesCheckedOutInOtherWorktree, sync.FetchAndAutoForwardBranchesNone, sync.FetchAndAutoForwardBranchesOnlyMainBranches, sync.FetchPrune,