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:
@ -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,
|
||||||
|
@ -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, "")
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
}
|
||||||
|
@ -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 {
|
||||||
|
@ -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}}'?",
|
||||||
|
Reference in New Issue
Block a user