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

Checkout worktree when creating from worktree view

This commit is contained in:
Jesse Duffield
2023-07-16 20:29:53 +10:00
parent 9b24995990
commit 9c69a5df69
2 changed files with 36 additions and 22 deletions

View File

@ -20,8 +20,8 @@ func (gui *Gui) resetHelpersAndControllers() {
helperCommon := gui.c helperCommon := gui.c
recordDirectoryHelper := helpers.NewRecordDirectoryHelper(helperCommon) recordDirectoryHelper := helpers.NewRecordDirectoryHelper(helperCommon)
reposHelper := helpers.NewRecentReposHelper(helperCommon, recordDirectoryHelper, gui.onNewRepo) reposHelper := helpers.NewRecentReposHelper(helperCommon, recordDirectoryHelper, gui.onNewRepo)
worktreeHelper := helpers.NewWorktreeHelper(helperCommon, reposHelper)
refsHelper := helpers.NewRefsHelper(helperCommon) refsHelper := helpers.NewRefsHelper(helperCommon)
worktreeHelper := helpers.NewWorktreeHelper(helperCommon, reposHelper, refsHelper)
rebaseHelper := helpers.NewMergeAndRebaseHelper(helperCommon, refsHelper) rebaseHelper := helpers.NewMergeAndRebaseHelper(helperCommon, refsHelper)
suggestionsHelper := helpers.NewSuggestionsHelper(helperCommon) suggestionsHelper := helpers.NewSuggestionsHelper(helperCommon)

View File

@ -24,12 +24,14 @@ type IWorktreeHelper interface {
type WorktreeHelper struct { type WorktreeHelper struct {
c *HelperCommon c *HelperCommon
reposHelper *ReposHelper reposHelper *ReposHelper
refsHelper *RefsHelper
} }
func NewWorktreeHelper(c *HelperCommon, reposHelper *ReposHelper) *WorktreeHelper { func NewWorktreeHelper(c *HelperCommon, reposHelper *ReposHelper, refsHelper *RefsHelper) *WorktreeHelper {
return &WorktreeHelper{ return &WorktreeHelper{
c: c, c: c,
reposHelper: reposHelper, reposHelper: reposHelper,
refsHelper: refsHelper,
} }
} }
@ -63,30 +65,42 @@ func (self *WorktreeHelper) IsWorktreePathMissing(w *models.Worktree) bool {
} }
func (self *WorktreeHelper) NewWorktree() error { func (self *WorktreeHelper) NewWorktree() error {
return self.c.Prompt(types.PromptOpts{ // what is the current branch?
Title: self.c.Tr.NewWorktreePath, branch := self.refsHelper.GetCheckedOutRef()
HandleConfirm: func(path string) error { currentBranchName := branch.RefName()
return self.c.Prompt(types.PromptOpts{
Title: self.c.Tr.NewWorktreeBranch, f := func(detached bool) error {
// TODO: suggestions return self.c.Prompt(types.PromptOpts{
HandleConfirm: func(base string) error { Title: self.c.Tr.NewWorktreeBranch,
return self.c.WithWaitingStatus(self.c.Tr.AddingWorktree, func(gocui.Task) error { InitialContent: currentBranchName,
self.c.LogAction(self.c.Tr.Actions.AddWorktree) // TODO: suggestions
if err := self.c.Git().Worktree.New(git_commands.NewWorktreeOpts{ HandleConfirm: func(base string) error {
Path: path, canCheckoutBase := base != currentBranchName
Base: base, return self.NewWorktreeCheckout(base, canCheckoutBase, detached)
}); err != nil { },
return err })
} }
return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.WORKTREES, types.BRANCHES, types.FILES}})
}) return self.c.Menu(types.CreateMenuOptions{
Title: self.c.Tr.WorktreeTitle,
Items: []*types.MenuItem{
{
LabelColumns: []string{"Create new worktree from ref"},
OnPress: func() error {
return f(false)
}, },
}) },
{
LabelColumns: []string{"Create new worktree from ref (detached)"},
OnPress: func() error {
return f(true)
},
},
}, },
}) })
} }
func (self *WorktreeHelper) NewWorktreeCheckout(base string, isBranch bool, detached bool) error { func (self *WorktreeHelper) NewWorktreeCheckout(base string, canCheckoutBase bool, detached bool) error {
opts := git_commands.NewWorktreeOpts{ opts := git_commands.NewWorktreeOpts{
Base: base, Base: base,
Detach: detached, Detach: detached,
@ -111,7 +125,7 @@ func (self *WorktreeHelper) NewWorktreeCheckout(base string, isBranch bool, deta
return f() return f()
} }
if isBranch { if canCheckoutBase {
// prompt for the new branch name where a blank means we just check out the branch // prompt for the new branch name where a blank means we just check out the branch
return self.c.Prompt(types.PromptOpts{ return self.c.Prompt(types.PromptOpts{
Title: fmt.Sprintf("New branch name (leave blank to checkout %s)", base), Title: fmt.Sprintf("New branch name (leave blank to checkout %s)", base),