1
0
mirror of https://github.com/jesseduffield/lazygit.git synced 2025-06-17 00:18:05 +02:00

Prompt to switch to worktree when branch is checked out by other worktree

This commit is contained in:
Jesse Duffield
2023-07-16 14:14:09 +10:00
parent fe8adf9eb8
commit 077ae99438
5 changed files with 53 additions and 17 deletions

View File

@ -45,7 +45,8 @@ func (gui *Gui) resetHelpersAndControllers() {
patchBuildingHelper := helpers.NewPatchBuildingHelper(helperCommon) patchBuildingHelper := helpers.NewPatchBuildingHelper(helperCommon)
stagingHelper := helpers.NewStagingHelper(helperCommon) stagingHelper := helpers.NewStagingHelper(helperCommon)
mergeConflictsHelper := helpers.NewMergeConflictsHelper(helperCommon) mergeConflictsHelper := helpers.NewMergeConflictsHelper(helperCommon)
worktreeHelper := helpers.NewWorktreeHelper(helperCommon) reposHelper := helpers.NewRecentReposHelper(helperCommon, recordDirectoryHelper, gui.onNewRepo)
worktreeHelper := helpers.NewWorktreeHelper(helperCommon, reposHelper)
refreshHelper := helpers.NewRefreshHelper( refreshHelper := helpers.NewRefreshHelper(
helperCommon, helperCommon,
refsHelper, refsHelper,
@ -94,7 +95,7 @@ func (gui *Gui) resetHelpersAndControllers() {
Commits: commitsHelper, Commits: commitsHelper,
Snake: helpers.NewSnakeHelper(helperCommon), Snake: helpers.NewSnakeHelper(helperCommon),
Diff: diffHelper, Diff: diffHelper,
Repos: helpers.NewRecentReposHelper(helperCommon, recordDirectoryHelper, gui.onNewRepo), Repos: reposHelper,
RecordDirectory: recordDirectoryHelper, RecordDirectory: recordDirectoryHelper,
Update: helpers.NewUpdateHelper(helperCommon, gui.Updater), Update: helpers.NewUpdateHelper(helperCommon, gui.Updater),
Window: windowHelper, Window: windowHelper,

View File

@ -202,10 +202,37 @@ func (self *BranchesController) press(selectedBranch *models.Branch) error {
return self.c.ErrorMsg(self.c.Tr.AlreadyCheckedOutBranch) return self.c.ErrorMsg(self.c.Tr.AlreadyCheckedOutBranch)
} }
if selectedBranch.CheckedOutByOtherWorktree {
worktreeForRef, ok := self.worktreeForRef(selectedBranch.Name)
if ok && !self.c.Git().Worktree.IsCurrentWorktree(worktreeForRef) {
return self.promptToCheckoutWorktree(worktreeForRef)
}
}
self.c.LogAction(self.c.Tr.Actions.CheckoutBranch) self.c.LogAction(self.c.Tr.Actions.CheckoutBranch)
return self.c.Helpers().Refs.CheckoutRef(selectedBranch.Name, types.CheckoutRefOptions{}) return self.c.Helpers().Refs.CheckoutRef(selectedBranch.Name, types.CheckoutRefOptions{})
} }
func (self *BranchesController) worktreeForRef(ref string) (*models.Worktree, bool) {
for _, worktree := range self.c.Model().Worktrees {
if worktree.Branch == ref {
return worktree, true
}
}
return nil, false
}
func (self *BranchesController) promptToCheckoutWorktree(worktree *models.Worktree) error {
return self.c.Confirm(types.ConfirmOpts{
Title: "Switch to worktree",
Prompt: fmt.Sprintf("This branch is checked out by worktree %s. Do you want to switch to that worktree?", worktree.Name()),
HandleConfirm: func() error {
return self.c.Helpers().Worktree.Switch(worktree)
},
})
}
func (self *BranchesController) handleCreatePullRequest(selectedBranch *models.Branch) error { func (self *BranchesController) handleCreatePullRequest(selectedBranch *models.Branch) error {
return self.createPullRequest(selectedBranch.Name, "") return self.createPullRequest(selectedBranch.Name, "")
} }

View File

@ -18,12 +18,14 @@ type IWorktreeHelper interface {
} }
type WorktreeHelper struct { type WorktreeHelper struct {
c *HelperCommon c *HelperCommon
reposHelper *ReposHelper
} }
func NewWorktreeHelper(c *HelperCommon) *WorktreeHelper { func NewWorktreeHelper(c *HelperCommon, reposHelper *ReposHelper) *WorktreeHelper {
return &WorktreeHelper{ return &WorktreeHelper{
c: c, c: c,
reposHelper: reposHelper,
} }
} }
@ -75,3 +77,17 @@ func (self *WorktreeHelper) NewWorktree() error {
}, },
}) })
} }
func (self *WorktreeHelper) Switch(worktree *models.Worktree) error {
if self.c.Git().Worktree.IsCurrentWorktree(worktree) {
return self.c.ErrorMsg(self.c.Tr.AlreadyInWorktree)
}
self.c.LogAction(self.c.Tr.SwitchToWorktree)
// if we were in a submodule, we want to forget about that stack of repos
// so that hitting escape in the new repo does nothing
self.c.State().GetRepoPathStack().Clear()
return self.reposHelper.DispatchSwitchTo(worktree.Path, true, self.c.Tr.ErrWorktreeMovedOrDeleted)
}

View File

@ -34,7 +34,7 @@ func (self *WorktreesController) GetKeybindings(opts types.KeybindingsOpts) []*t
{ {
Key: opts.GetKey(opts.Config.Universal.Select), Key: opts.GetKey(opts.Config.Universal.Select),
Handler: self.checkSelected(self.enter), Handler: self.checkSelected(self.enter),
Description: self.c.Tr.EnterWorktree, Description: self.c.Tr.SwitchToWorktree,
}, },
{ {
Key: opts.GetKey(opts.Config.Universal.Remove), Key: opts.GetKey(opts.Config.Universal.Remove),
@ -143,15 +143,7 @@ func (self *WorktreesController) GetOnClick() func() error {
} }
func (self *WorktreesController) enter(worktree *models.Worktree) error { func (self *WorktreesController) enter(worktree *models.Worktree) error {
if self.c.Git().Worktree.IsCurrentWorktree(worktree) { return self.c.Helpers().Worktree.Switch(worktree)
return self.c.ErrorMsg(self.c.Tr.AlreadyInWorktree)
}
// if we were in a submodule, we want to forget about that stack of repos
// so that hitting escape in the new repo does nothing
self.c.State().GetRepoPathStack().Clear()
return self.c.Helpers().Repos.DispatchSwitchTo(worktree.Path, true, self.c.Tr.ErrWorktreeMovedOrDeleted)
} }
func (self *WorktreesController) checkSelected(callback func(worktree *models.Worktree) error) func() error { func (self *WorktreesController) checkSelected(callback func(worktree *models.Worktree) error) func() error {

View File

@ -542,7 +542,7 @@ type TranslationSet struct {
FilterPrefix string FilterPrefix string
ExitSearchMode string ExitSearchMode string
ExitTextFilterMode string ExitTextFilterMode string
EnterWorktree string SwitchToWorktree string
RemoveWorktree string RemoveWorktree string
RemoveWorktreeTitle string RemoveWorktreeTitle string
WorktreesTitle string WorktreesTitle string
@ -1266,7 +1266,7 @@ func EnglishTranslationSet() TranslationSet {
FilterPrefix: "Filter: ", FilterPrefix: "Filter: ",
WorktreesTitle: "Worktrees", WorktreesTitle: "Worktrees",
WorktreeTitle: "Worktree", WorktreeTitle: "Worktree",
EnterWorktree: "Enter worktree", SwitchToWorktree: "Switch to worktree",
RemoveWorktree: "Remove worktree", RemoveWorktree: "Remove worktree",
RemoveWorktreeTitle: "Remove worktree", RemoveWorktreeTitle: "Remove worktree",
RemoveWorktreePrompt: "Are you sure you want to remove worktree '{{.worktreeName}}'?", RemoveWorktreePrompt: "Are you sure you want to remove worktree '{{.worktreeName}}'?",