Skip to content

Commit

Permalink
Add worktree option to fast forwarding operation (#4051)
Browse files Browse the repository at this point in the history
- **PR Description**

Fix a reported issue regarding Fast-forwarding a branch that is checked
out in a different worktree. It's reported, and I could
[repro](#2957 (comment)),
that whenever such an action is taken, the current worktree is polluted
with unwanted File changes related to the Fast-forward operation.

A solution is suggested – and tested to produce expected results – that
adding `--work-tree` option to the generated command should fix the
issue.

[Issue: 2957](#2957)

I'm proposing to merge these changes as it produces expected results:
<img width="1722" alt="Screenshot 2024-11-08 at 19 55 31"
src="https://github.com/user-attachments/assets/89ac1c8d-7a64-4d88-afd9-3ec3d41705f1">



- **Please check if the PR fulfills these requirements**

* [ ] Cheatsheets are up-to-date (run `go generate ./...`)
* [x] Code has been formatted (see
[here](https://github.com/jesseduffield/lazygit/blob/master/CONTRIBUTING.md#code-formatting))
* [ ] Tests have been added/updated (see
[here](https://github.com/jesseduffield/lazygit/blob/master/pkg/integration/README.md)
for the integration test guide)
* [ ] Text is internationalised (see
[here](https://github.com/jesseduffield/lazygit/blob/master/CONTRIBUTING.md#internationalisation))
* [ ] If a new UserConfig entry was added, make sure it can be
hot-reloaded (see
[here](https://github.com/jesseduffield/lazygit/blob/master/docs/dev/Codebase_Guide.md#using-userconfig))
* [ ] Docs have been updated if necessary
* [x] You've read through your own file changes for silly mistakes etc

<!--
Be sure to name your PR with an imperative e.g. 'Add worktrees view'
see https://github.com/jesseduffield/lazygit/releases/tag/v0.40.0 for
examples
-->
  • Loading branch information
jesseduffield authored Jan 2, 2025
2 parents c4e59ae + fc78082 commit 5e9ba82
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 0 deletions.
8 changes: 8 additions & 0 deletions pkg/commands/git_commands/git_command_builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,14 @@ func (self *GitCommandBuilder) Worktree(path string) *GitCommandBuilder {
return self
}

func (self *GitCommandBuilder) WorktreePathIf(condition bool, path string) *GitCommandBuilder {
if condition {
return self.Worktree(path)
}

return self
}

// Note, you may prefer to use the Dir method instead of this one
func (self *GitCommandBuilder) GitDir(path string) *GitCommandBuilder {
// git dir arg comes before the command
Expand Down
2 changes: 2 additions & 0 deletions pkg/commands/git_commands/sync.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ type PullOptions struct {
BranchName string
FastForwardOnly bool
WorktreeGitDir string
WorktreePath string
}

func (self *SyncCommands) Pull(task gocui.Task, opts PullOptions) error {
Expand All @@ -97,6 +98,7 @@ func (self *SyncCommands) Pull(task gocui.Task, opts PullOptions) error {
ArgIf(opts.RemoteName != "", opts.RemoteName).
ArgIf(opts.BranchName != "", "refs/heads/"+opts.BranchName).
GitDirIf(opts.WorktreeGitDir != "", opts.WorktreeGitDir).
WorktreePathIf(opts.WorktreePath != "", opts.WorktreePath).
ToArgv()

// setting GIT_SEQUENCE_EDITOR to ':' as a way of skipping it, in case the user
Expand Down
3 changes: 3 additions & 0 deletions pkg/gui/controllers/branches_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -629,9 +629,11 @@ func (self *BranchesController) fastForward(branch *models.Branch) error {
self.c.LogAction(action)

worktreeGitDir := ""
worktreePath := ""
// if it is the current worktree path, no need to specify the path
if !worktree.IsCurrent {
worktreeGitDir = worktree.GitDir
worktreePath = worktree.Path
}

err := self.c.Git().Sync.Pull(
Expand All @@ -641,6 +643,7 @@ func (self *BranchesController) fastForward(branch *models.Branch) error {
BranchName: branch.UpstreamBranch,
FastForwardOnly: true,
WorktreeGitDir: worktreeGitDir,
WorktreePath: worktreePath,
},
)
_ = self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC})
Expand Down
1 change: 1 addition & 0 deletions pkg/integration/tests/test_list.go
Original file line number Diff line number Diff line change
Expand Up @@ -380,6 +380,7 @@ var tests = []*components.IntegrationTest{
worktree.DoubleNestedLinkedSubmodule,
worktree.ExcludeFileInWorktree,
worktree.FastForwardWorktreeBranch,
worktree.FastForwardWorktreeBranchShouldNotPolluteCurrentWorktree,
worktree.ForceRemoveWorktree,
worktree.RemoveWorktreeFromBranch,
worktree.ResetWindowTabs,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package worktree

import (
"github.com/jesseduffield/lazygit/pkg/config"
. "github.com/jesseduffield/lazygit/pkg/integration/components"
)

var FastForwardWorktreeBranchShouldNotPolluteCurrentWorktree = NewIntegrationTest(NewIntegrationTestArgs{
Description: "Fast-forward a linked worktree branch from another worktree",
ExtraCmdArgs: []string{},
Skip: false,
SetupConfig: func(config *config.AppConfig) {},
SetupRepo: func(shell *Shell) {
// both main and linked worktree will have changed to fast-forward
shell.NewBranch("mybranch")
shell.CreateFileAndAdd("README.md", "hello world")
shell.Commit("initial commit")
shell.EmptyCommit("two")
shell.EmptyCommit("three")
shell.NewBranch("newbranch")

shell.CloneIntoRemote("origin")
shell.SetBranchUpstream("mybranch", "origin/mybranch")
shell.SetBranchUpstream("newbranch", "origin/newbranch")

// remove the 'three' commit so that we have something to pull from the remote
shell.HardReset("HEAD^")
shell.Checkout("mybranch")
shell.HardReset("HEAD^")

shell.AddWorktreeCheckout("newbranch", "../linked-worktree")
},
Run: func(t *TestDriver, keys config.KeybindingConfig) {
t.Views().Branches().
Focus().
Lines(
Contains("mybranch").Contains("↓1").IsSelected(),
Contains("newbranch (worktree)").Contains("↓1"),
).
Press(keys.Branches.FastForward).
Lines(
Contains("mybranch").Contains("✓").IsSelected(),
Contains("newbranch (worktree)").Contains("↓1"),
).
NavigateToLine(Contains("newbranch (worktree)")).
Press(keys.Branches.FastForward).
Lines(
Contains("mybranch").Contains("✓"),
Contains("newbranch (worktree)").Contains("✓").IsSelected(),
).
NavigateToLine(Contains("mybranch"))

// check the current worktree that it has no lines in the File changes pane
t.Views().Files().
Focus().
Press(keys.Files.RefreshFiles).
LineCount(EqualsInt(0))
},
})

0 comments on commit 5e9ba82

Please sign in to comment.