mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-04-21 04:25:53 +03:00
Now that we have an error handler set, we can simply let them bubble up all the way to gocui.
112 lines
2.8 KiB
Go
112 lines
2.8 KiB
Go
package controllers
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/jesseduffield/lazygit/pkg/commands/models"
|
|
"github.com/jesseduffield/lazygit/pkg/gui/types"
|
|
"github.com/jesseduffield/lazygit/pkg/utils"
|
|
)
|
|
|
|
type GitFlowController struct {
|
|
baseController
|
|
*ListControllerTrait[*models.Branch]
|
|
c *ControllerCommon
|
|
}
|
|
|
|
var _ types.IController = &GitFlowController{}
|
|
|
|
func NewGitFlowController(
|
|
c *ControllerCommon,
|
|
) *GitFlowController {
|
|
return &GitFlowController{
|
|
baseController: baseController{},
|
|
ListControllerTrait: NewListControllerTrait[*models.Branch](
|
|
c,
|
|
c.Contexts().Branches,
|
|
c.Contexts().Branches.GetSelected,
|
|
c.Contexts().Branches.GetSelectedItems,
|
|
),
|
|
c: c,
|
|
}
|
|
}
|
|
|
|
func (self *GitFlowController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding {
|
|
bindings := []*types.Binding{
|
|
{
|
|
Key: opts.GetKey(opts.Config.Branches.ViewGitFlowOptions),
|
|
Handler: self.withItem(self.handleCreateGitFlowMenu),
|
|
Description: self.c.Tr.GitFlowOptions,
|
|
OpensMenu: true,
|
|
},
|
|
}
|
|
|
|
return bindings
|
|
}
|
|
|
|
func (self *GitFlowController) handleCreateGitFlowMenu(branch *models.Branch) error {
|
|
if !self.c.Git().Flow.GitFlowEnabled() {
|
|
return self.c.ErrorMsg("You need to install git-flow and enable it in this repo to use git-flow features")
|
|
}
|
|
|
|
startHandler := func(branchType string) func() error {
|
|
return func() error {
|
|
title := utils.ResolvePlaceholderString(self.c.Tr.NewGitFlowBranchPrompt, map[string]string{"branchType": branchType})
|
|
|
|
return self.c.Prompt(types.PromptOpts{
|
|
Title: title,
|
|
HandleConfirm: func(name string) error {
|
|
self.c.LogAction(self.c.Tr.Actions.GitFlowStart)
|
|
return self.c.RunSubprocessAndRefresh(
|
|
self.c.Git().Flow.StartCmdObj(branchType, name),
|
|
)
|
|
},
|
|
})
|
|
}
|
|
}
|
|
|
|
return self.c.Menu(types.CreateMenuOptions{
|
|
Title: "git flow",
|
|
Items: []*types.MenuItem{
|
|
{
|
|
// not localising here because it's one to one with the actual git flow commands
|
|
Label: fmt.Sprintf("finish branch '%s'", branch.Name),
|
|
OnPress: func() error {
|
|
return self.gitFlowFinishBranch(branch.Name)
|
|
},
|
|
DisabledReason: self.require(self.singleItemSelected())(),
|
|
},
|
|
{
|
|
Label: "start feature",
|
|
OnPress: startHandler("feature"),
|
|
Key: 'f',
|
|
},
|
|
{
|
|
Label: "start hotfix",
|
|
OnPress: startHandler("hotfix"),
|
|
Key: 'h',
|
|
},
|
|
{
|
|
Label: "start bugfix",
|
|
OnPress: startHandler("bugfix"),
|
|
Key: 'b',
|
|
},
|
|
{
|
|
Label: "start release",
|
|
OnPress: startHandler("release"),
|
|
Key: 'r',
|
|
},
|
|
},
|
|
})
|
|
}
|
|
|
|
func (self *GitFlowController) gitFlowFinishBranch(branchName string) error {
|
|
cmdObj, err := self.c.Git().Flow.FinishCmdObj(branchName)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
self.c.LogAction(self.c.Tr.Actions.GitFlowFinish)
|
|
return self.c.RunSubprocessAndRefresh(cmdObj)
|
|
}
|