mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-04-27 12:32:37 +02:00
Add worktree tests for removing/detaching
This commit is contained in:
parent
277142fc4b
commit
b93b9dae88
@ -42,20 +42,30 @@ func (self *GitCommandBuilder) Config(value string) *GitCommandBuilder {
|
|||||||
return self
|
return self
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *GitCommandBuilder) RepoPath(value string) *GitCommandBuilder {
|
// the -C arg will make git do a `cd` to the directory before doing anything else
|
||||||
|
func (self *GitCommandBuilder) Dir(path string) *GitCommandBuilder {
|
||||||
// repo path comes before the command
|
// repo path comes before the command
|
||||||
self.args = append([]string{"-C", value}, self.args...)
|
self.args = append([]string{"-C", path}, self.args...)
|
||||||
|
|
||||||
return self
|
return self
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *GitCommandBuilder) WorktreePath(path string) *GitCommandBuilder {
|
// Note, you may prefer to use the Dir method instead of this one
|
||||||
// worktree path comes before the command
|
func (self *GitCommandBuilder) Worktree(path string) *GitCommandBuilder {
|
||||||
|
// worktree arg comes before the command
|
||||||
self.args = append([]string{"--work-tree", path}, self.args...)
|
self.args = append([]string{"--work-tree", path}, self.args...)
|
||||||
|
|
||||||
return self
|
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
|
||||||
|
self.args = append([]string{"--git-dir", path}, self.args...)
|
||||||
|
|
||||||
|
return self
|
||||||
|
}
|
||||||
|
|
||||||
func (self *GitCommandBuilder) ToArgv() []string {
|
func (self *GitCommandBuilder) ToArgv() []string {
|
||||||
return append([]string{"git"}, self.args...)
|
return append([]string{"git"}, self.args...)
|
||||||
}
|
}
|
||||||
|
@ -45,7 +45,7 @@ func TestGitCommandBuilder(t *testing.T) {
|
|||||||
expected: []string{"git", "-c", "user.email=bar", "-c", "user.name=foo", "push"},
|
expected: []string{"git", "-c", "user.email=bar", "-c", "user.name=foo", "push"},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
input: NewGitCmd("push").RepoPath("a/b/c").ToArgv(),
|
input: NewGitCmd("push").Dir("a/b/c").ToArgv(),
|
||||||
expected: []string{"git", "-C", "a/b/c", "push"},
|
expected: []string{"git", "-C", "a/b/c", "push"},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -82,7 +82,7 @@ func (self *SubmoduleCommands) Stash(submodule *models.SubmoduleConfig) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
cmdArgs := NewGitCmd("stash").
|
cmdArgs := NewGitCmd("stash").
|
||||||
RepoPath(submodule.Path).
|
Dir(submodule.Path).
|
||||||
Arg("--include-untracked").
|
Arg("--include-untracked").
|
||||||
ToArgv()
|
ToArgv()
|
||||||
|
|
||||||
|
@ -54,9 +54,9 @@ func (self *WorktreeCommands) Delete(worktreePath string, force bool) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (self *WorktreeCommands) Detach(worktreePath string) error {
|
func (self *WorktreeCommands) Detach(worktreePath string) error {
|
||||||
cmdArgs := NewGitCmd("checkout").Arg("--detach").ToArgv()
|
cmdArgs := NewGitCmd("checkout").Arg("--detach").GitDir(filepath.Join(worktreePath, ".git")).ToArgv()
|
||||||
|
|
||||||
return self.cmd.New(cmdArgs).SetWd(worktreePath).Run()
|
return self.cmd.New(cmdArgs).Run()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *WorktreeCommands) IsCurrentWorktree(path string) bool {
|
func (self *WorktreeCommands) IsCurrentWorktree(path string) bool {
|
||||||
|
@ -261,6 +261,16 @@ func (self *Shell) AddWorktree(base string, path string, newBranchName string) *
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (self *Shell) AddFileInWorktree(worktreePath string) *Shell {
|
||||||
|
self.CreateFile(filepath.Join(worktreePath, "content"), "content")
|
||||||
|
|
||||||
|
self.RunCommand([]string{
|
||||||
|
"git", "-C", worktreePath, "add", "content",
|
||||||
|
})
|
||||||
|
|
||||||
|
return self
|
||||||
|
}
|
||||||
|
|
||||||
func (self *Shell) MakeExecutable(path string) *Shell {
|
func (self *Shell) MakeExecutable(path string) *Shell {
|
||||||
// 0755 sets the executable permission for owner, and read/execute permissions for group and others
|
// 0755 sets the executable permission for owner, and read/execute permissions for group and others
|
||||||
err := os.Chmod(filepath.Join(self.dir, path), 0o755)
|
err := os.Chmod(filepath.Join(self.dir, path), 0o755)
|
||||||
|
@ -222,6 +222,9 @@ var tests = []*components.IntegrationTest{
|
|||||||
undo.UndoDrop,
|
undo.UndoDrop,
|
||||||
worktree.AddFromBranch,
|
worktree.AddFromBranch,
|
||||||
worktree.Crud,
|
worktree.Crud,
|
||||||
|
worktree.DetachWorktreeFromBranch,
|
||||||
|
worktree.ForceRemoveWorktree,
|
||||||
worktree.Rebase,
|
worktree.Rebase,
|
||||||
|
worktree.RemoveWorktreeFromBranch,
|
||||||
worktree.WorktreeInRepo,
|
worktree.WorktreeInRepo,
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,48 @@
|
|||||||
|
package worktree
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/jesseduffield/lazygit/pkg/config"
|
||||||
|
. "github.com/jesseduffield/lazygit/pkg/integration/components"
|
||||||
|
)
|
||||||
|
|
||||||
|
var DetachWorktreeFromBranch = NewIntegrationTest(NewIntegrationTestArgs{
|
||||||
|
Description: "Detach a worktree from the branches view",
|
||||||
|
ExtraCmdArgs: []string{},
|
||||||
|
Skip: false,
|
||||||
|
SetupConfig: func(config *config.AppConfig) {},
|
||||||
|
SetupRepo: func(shell *Shell) {
|
||||||
|
shell.NewBranch("mybranch")
|
||||||
|
shell.CreateFileAndAdd("README.md", "hello world")
|
||||||
|
shell.Commit("initial commit")
|
||||||
|
shell.EmptyCommit("commit 2")
|
||||||
|
shell.EmptyCommit("commit 3")
|
||||||
|
shell.AddWorktree("mybranch", "../linked-worktree", "newbranch")
|
||||||
|
},
|
||||||
|
Run: func(t *TestDriver, keys config.KeybindingConfig) {
|
||||||
|
t.Views().Branches().
|
||||||
|
Focus().
|
||||||
|
Lines(
|
||||||
|
Contains("mybranch").IsSelected(),
|
||||||
|
Contains("newbranch (worktree)"),
|
||||||
|
).
|
||||||
|
NavigateToLine(Contains("newbranch")).
|
||||||
|
Press(keys.Universal.Remove).
|
||||||
|
Tap(func() {
|
||||||
|
t.ExpectPopup().Menu().
|
||||||
|
Title(Equals("Branch newbranch is checked out by worktree linked-worktree")).
|
||||||
|
Select(Equals("Detach worktree")).
|
||||||
|
Confirm()
|
||||||
|
}).
|
||||||
|
Lines(
|
||||||
|
Contains("mybranch"),
|
||||||
|
Contains("newbranch").DoesNotContain("(worktree").IsSelected(),
|
||||||
|
)
|
||||||
|
|
||||||
|
t.Views().Worktrees().
|
||||||
|
Focus().
|
||||||
|
Lines(
|
||||||
|
Contains("repo (main)").IsSelected(),
|
||||||
|
Contains("linked-worktree"),
|
||||||
|
)
|
||||||
|
},
|
||||||
|
})
|
46
pkg/integration/tests/worktree/force_remove_worktree.go
Normal file
46
pkg/integration/tests/worktree/force_remove_worktree.go
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
package worktree
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/jesseduffield/lazygit/pkg/config"
|
||||||
|
. "github.com/jesseduffield/lazygit/pkg/integration/components"
|
||||||
|
)
|
||||||
|
|
||||||
|
var ForceRemoveWorktree = NewIntegrationTest(NewIntegrationTestArgs{
|
||||||
|
Description: "Force remove a dirty worktree",
|
||||||
|
ExtraCmdArgs: []string{},
|
||||||
|
Skip: false,
|
||||||
|
SetupConfig: func(config *config.AppConfig) {},
|
||||||
|
SetupRepo: func(shell *Shell) {
|
||||||
|
shell.NewBranch("mybranch")
|
||||||
|
shell.CreateFileAndAdd("README.md", "hello world")
|
||||||
|
shell.Commit("initial commit")
|
||||||
|
shell.EmptyCommit("commit 2")
|
||||||
|
shell.EmptyCommit("commit 3")
|
||||||
|
shell.AddWorktree("mybranch", "../linked-worktree", "newbranch")
|
||||||
|
shell.AddFileInWorktree("../linked-worktree")
|
||||||
|
},
|
||||||
|
Run: func(t *TestDriver, keys config.KeybindingConfig) {
|
||||||
|
t.Views().Worktrees().
|
||||||
|
Focus().
|
||||||
|
Lines(
|
||||||
|
Contains("repo (main)").IsSelected(),
|
||||||
|
Contains("linked-worktree"),
|
||||||
|
).
|
||||||
|
NavigateToLine(Contains("linked-worktree")).
|
||||||
|
Press(keys.Universal.Remove).
|
||||||
|
Tap(func() {
|
||||||
|
t.ExpectPopup().Confirmation().
|
||||||
|
Title(Equals("Remove worktree")).
|
||||||
|
Content(Equals("Are you sure you want to remove worktree 'linked-worktree'?")).
|
||||||
|
Confirm()
|
||||||
|
|
||||||
|
t.ExpectPopup().Confirmation().
|
||||||
|
Title(Equals("Remove worktree")).
|
||||||
|
Content(Equals("'linked-worktree' contains modified or untracked files (to be honest, it could contain both). Are you sure you want to remove it?")).
|
||||||
|
Confirm()
|
||||||
|
}).
|
||||||
|
Lines(
|
||||||
|
Contains("repo (main)").IsSelected(),
|
||||||
|
)
|
||||||
|
},
|
||||||
|
})
|
@ -0,0 +1,58 @@
|
|||||||
|
package worktree
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/jesseduffield/lazygit/pkg/config"
|
||||||
|
. "github.com/jesseduffield/lazygit/pkg/integration/components"
|
||||||
|
)
|
||||||
|
|
||||||
|
var RemoveWorktreeFromBranch = NewIntegrationTest(NewIntegrationTestArgs{
|
||||||
|
Description: "Remove a worktree from the branches view",
|
||||||
|
ExtraCmdArgs: []string{},
|
||||||
|
Skip: false,
|
||||||
|
SetupConfig: func(config *config.AppConfig) {},
|
||||||
|
SetupRepo: func(shell *Shell) {
|
||||||
|
shell.NewBranch("mybranch")
|
||||||
|
shell.CreateFileAndAdd("README.md", "hello world")
|
||||||
|
shell.Commit("initial commit")
|
||||||
|
shell.EmptyCommit("commit 2")
|
||||||
|
shell.EmptyCommit("commit 3")
|
||||||
|
shell.AddWorktree("mybranch", "../linked-worktree", "newbranch")
|
||||||
|
shell.AddFileInWorktree("../linked-worktree")
|
||||||
|
},
|
||||||
|
Run: func(t *TestDriver, keys config.KeybindingConfig) {
|
||||||
|
t.Views().Branches().
|
||||||
|
Focus().
|
||||||
|
Lines(
|
||||||
|
Contains("mybranch").IsSelected(),
|
||||||
|
Contains("newbranch (worktree)"),
|
||||||
|
).
|
||||||
|
NavigateToLine(Contains("newbranch")).
|
||||||
|
Press(keys.Universal.Remove).
|
||||||
|
Tap(func() {
|
||||||
|
t.ExpectPopup().Menu().
|
||||||
|
Title(Equals("Branch newbranch is checked out by worktree linked-worktree")).
|
||||||
|
Select(Equals("Remove worktree")).
|
||||||
|
Confirm()
|
||||||
|
|
||||||
|
t.ExpectPopup().Confirmation().
|
||||||
|
Title(Equals("Remove worktree")).
|
||||||
|
Content(Equals("Are you sure you want to remove worktree 'linked-worktree'?")).
|
||||||
|
Confirm()
|
||||||
|
|
||||||
|
t.ExpectPopup().Confirmation().
|
||||||
|
Title(Equals("Remove worktree")).
|
||||||
|
Content(Equals("'linked-worktree' contains modified or untracked files (to be honest, it could contain both). Are you sure you want to remove it?")).
|
||||||
|
Confirm()
|
||||||
|
}).
|
||||||
|
Lines(
|
||||||
|
Contains("mybranch"),
|
||||||
|
Contains("newbranch").DoesNotContain("(worktree").IsSelected(),
|
||||||
|
)
|
||||||
|
|
||||||
|
t.Views().Worktrees().
|
||||||
|
Focus().
|
||||||
|
Lines(
|
||||||
|
Contains("repo (main)").IsSelected(),
|
||||||
|
)
|
||||||
|
},
|
||||||
|
})
|
Loading…
x
Reference in New Issue
Block a user