1
0
mirror of https://github.com/jesseduffield/lazygit.git synced 2025-02-09 13:47:11 +02:00

add actions abstraction

This commit is contained in:
Jesse Duffield 2022-01-30 10:17:55 +11:00
parent 51547e3822
commit 77d0732fa8
4 changed files with 100 additions and 77 deletions

View File

@ -17,7 +17,6 @@ type (
CheckoutRefFn func(refName string, opts types.CheckoutRefOptions) error
CreateGitResetMenuFn func(refName string) error
SwitchToCommitFilesContextFn func(SwitchToCommitFilesContextOpts) error
CreateTagMenuFn func(commitSha string) error
GetHostingServiceMgrFn func() *hosting_service.HostingServiceMgr
PullFilesFn func() error
CheckMergeOrRebase func(error) error
@ -29,6 +28,7 @@ type LocalCommitsController struct {
getContext func() types.IListContext
os *oscommands.OSCommand
git *commands.GitCommand
tagActions *TagActions
refHelper IRefHelper
getSelectedLocalCommit func() *models.Commit
@ -36,7 +36,6 @@ type LocalCommitsController struct {
getSelectedLocalCommitIdx func() int
checkMergeOrRebase CheckMergeOrRebase
pullFiles PullFilesFn
createTagMenu CreateTagMenuFn
getHostingServiceMgr GetHostingServiceMgrFn
switchToCommitFilesContext SwitchToCommitFilesContextFn
openSearch OpenSearchFn
@ -53,13 +52,13 @@ func NewLocalCommitsController(
getContext func() types.IListContext,
os *oscommands.OSCommand,
git *commands.GitCommand,
tagActions *TagActions,
refHelper IRefHelper,
getSelectedLocalCommit func() *models.Commit,
getCommits func() []*models.Commit,
getSelectedLocalCommitIdx func() int,
checkMergeOrRebase CheckMergeOrRebase,
pullFiles PullFilesFn,
createTagMenu CreateTagMenuFn,
getHostingServiceMgr GetHostingServiceMgrFn,
switchToCommitFilesContext SwitchToCommitFilesContextFn,
openSearch OpenSearchFn,
@ -73,13 +72,13 @@ func NewLocalCommitsController(
getContext: getContext,
os: os,
git: git,
tagActions: tagActions,
refHelper: refHelper,
getSelectedLocalCommit: getSelectedLocalCommit,
getCommits: getCommits,
getSelectedLocalCommitIdx: getSelectedLocalCommitIdx,
checkMergeOrRebase: checkMergeOrRebase,
pullFiles: pullFiles,
createTagMenu: createTagMenu,
getHostingServiceMgr: getHostingServiceMgr,
switchToCommitFilesContext: switchToCommitFilesContext,
openSearch: openSearch,
@ -607,7 +606,7 @@ func (self *LocalCommitsController) handleSquashAllAboveFixupCommits(commit *mod
}
func (self *LocalCommitsController) handleTagCommit(commit *models.Commit) error {
return self.createTagMenu(commit.Sha)
return self.tagActions.CreateTagMenu(commit.Sha, func() {})
}
func (self *LocalCommitsController) handleCheckoutCommit(commit *models.Commit) error {

View File

@ -0,0 +1,80 @@
package controllers
import (
"github.com/jesseduffield/lazygit/pkg/commands"
"github.com/jesseduffield/lazygit/pkg/gui/types"
)
// Actions structs are for defining functionality that could be used by multiple contexts.
// For example, here we have a CreateTagMenu which is applicable to both the tags context
// and the commits context.
type TagActions struct {
c *types.ControllerCommon
git *commands.GitCommand
}
func NewTagActions(c *types.ControllerCommon, git *commands.GitCommand) *TagActions {
return &TagActions{
c: c,
git: git,
}
}
func (self *TagActions) CreateTagMenu(commitSha string, onCreate func()) error {
return self.c.Menu(types.CreateMenuOptions{
Title: self.c.Tr.TagMenuTitle,
Items: []*types.MenuItem{
{
DisplayString: self.c.Tr.LcLightweightTag,
OnPress: func() error {
return self.handleCreateLightweightTag(commitSha, onCreate)
},
},
{
DisplayString: self.c.Tr.LcAnnotatedTag,
OnPress: func() error {
return self.handleCreateAnnotatedTag(commitSha, onCreate)
},
},
},
})
}
func (self *TagActions) afterTagCreate(onCreate func()) error {
onCreate()
return self.c.Refresh(types.RefreshOptions{
Mode: types.ASYNC, Scope: []types.RefreshableView{types.COMMITS, types.TAGS},
})
}
func (self *TagActions) handleCreateAnnotatedTag(commitSha string, onCreate func()) error {
return self.c.Prompt(types.PromptOpts{
Title: self.c.Tr.TagNameTitle,
HandleConfirm: func(tagName string) error {
return self.c.Prompt(types.PromptOpts{
Title: self.c.Tr.TagMessageTitle,
HandleConfirm: func(msg string) error {
self.c.LogAction(self.c.Tr.Actions.CreateAnnotatedTag)
if err := self.git.Tag.CreateAnnotated(tagName, commitSha, msg); err != nil {
return self.c.Error(err)
}
return self.afterTagCreate(onCreate)
},
})
},
})
}
func (self *TagActions) handleCreateLightweightTag(commitSha string, onCreate func()) error {
return self.c.Prompt(types.PromptOpts{
Title: self.c.Tr.TagNameTitle,
HandleConfirm: func(tagName string) error {
self.c.LogAction(self.c.Tr.Actions.CreateLightweightTag)
if err := self.git.Tag.CreateLightweight(tagName, commitSha); err != nil {
return self.c.Error(err)
}
return self.afterTagCreate(onCreate)
},
})
}

View File

@ -14,6 +14,7 @@ type TagsController struct {
getContext func() *context.TagsContext
git *commands.GitCommand
getContexts func() context.ContextTree
tagActions *TagActions
refHelper IRefHelper
suggestionsHelper ISuggestionsHelper
@ -28,6 +29,7 @@ func NewTagsController(
getContext func() *context.TagsContext,
git *commands.GitCommand,
getContexts func() context.ContextTree,
tagActions *TagActions,
refHelper IRefHelper,
suggestionsHelper ISuggestionsHelper,
@ -38,6 +40,7 @@ func NewTagsController(
getContext: getContext,
git: git,
getContexts: getContexts,
tagActions: tagActions,
refHelper: refHelper,
suggestionsHelper: suggestionsHelper,
@ -146,67 +149,9 @@ func (self *TagsController) createResetMenu(tag *models.Tag) error {
return self.refHelper.CreateGitResetMenu(tag.Name)
}
func (self *TagsController) CreateTagMenu(commitSha string) error {
return self.c.Menu(types.CreateMenuOptions{
Title: self.c.Tr.TagMenuTitle,
Items: []*types.MenuItem{
{
DisplayString: self.c.Tr.LcLightweightTag,
OnPress: func() error {
return self.handleCreateLightweightTag(commitSha)
},
},
{
DisplayString: self.c.Tr.LcAnnotatedTag,
OnPress: func() error {
return self.handleCreateAnnotatedTag(commitSha)
},
},
},
})
}
func (self *TagsController) afterTagCreate() error {
self.getContext().GetPanelState().SetSelectedLineIdx(0)
return self.c.Refresh(types.RefreshOptions{
Mode: types.ASYNC, Scope: []types.RefreshableView{types.COMMITS, types.TAGS},
})
}
func (self *TagsController) handleCreateAnnotatedTag(commitSha string) error {
return self.c.Prompt(types.PromptOpts{
Title: self.c.Tr.TagNameTitle,
HandleConfirm: func(tagName string) error {
return self.c.Prompt(types.PromptOpts{
Title: self.c.Tr.TagMessageTitle,
HandleConfirm: func(msg string) error {
self.c.LogAction(self.c.Tr.Actions.CreateAnnotatedTag)
if err := self.git.Tag.CreateAnnotated(tagName, commitSha, msg); err != nil {
return self.c.Error(err)
}
return self.afterTagCreate()
},
})
},
})
}
func (self *TagsController) handleCreateLightweightTag(commitSha string) error {
return self.c.Prompt(types.PromptOpts{
Title: self.c.Tr.TagNameTitle,
HandleConfirm: func(tagName string) error {
self.c.LogAction(self.c.Tr.Actions.CreateLightweightTag)
if err := self.git.Tag.CreateLightweight(tagName, commitSha); err != nil {
return self.c.Error(err)
}
return self.afterTagCreate()
},
})
}
func (self *TagsController) create() error {
// leaving commit SHA blank so that we're just creating the tag for the current commit
return self.CreateTagMenu("")
return self.tagActions.CreateTagMenu("", func() { self.getContext().GetPanelState().SetSelectedLineIdx(0) })
}
func (self *TagsController) withSelectedTag(f func(tag *models.Tag) error) func() error {

View File

@ -581,15 +581,7 @@ func (gui *Gui) setControllers() {
gui.fileHelper = NewFileHelper(controllerCommon, gui.git, osCommand)
gui.workingTreeHelper = NewWorkingTreeHelper(func() *filetree.FileTreeViewModel { return gui.State.FileTreeViewModel })
tagsController := controllers.NewTagsController(
controllerCommon,
func() *context.TagsContext { return gui.State.Contexts.Tags },
gui.git,
getContexts,
refHelper,
gui.suggestionsHelper,
gui.switchToSubCommitsContext,
)
tagActions := controllers.NewTagActions(controllerCommon, gui.git)
syncController := controllers.NewSyncController(
controllerCommon,
@ -629,20 +621,28 @@ func (gui *Gui) setControllers() {
gui.fileHelper,
gui.workingTreeHelper,
),
Tags: tagsController,
Tags: controllers.NewTagsController(
controllerCommon,
func() *context.TagsContext { return gui.State.Contexts.Tags },
gui.git,
getContexts,
tagActions,
refHelper,
gui.suggestionsHelper,
gui.switchToSubCommitsContext,
),
LocalCommits: controllers.NewLocalCommitsController(
controllerCommon,
func() types.IListContext { return gui.State.Contexts.BranchCommits },
osCommand,
gui.git,
tagActions,
refHelper,
gui.getSelectedLocalCommit,
func() []*models.Commit { return gui.State.Commits },
func() int { return gui.State.Panels.Commits.SelectedLineIdx },
gui.checkMergeOrRebase,
syncController.HandlePull,
tagsController.CreateTagMenu,
gui.getHostingServiceMgr,
gui.SwitchToCommitFilesContext,
gui.handleOpenSearch,
@ -651,7 +651,6 @@ func (gui *Gui) setControllers() {
func() bool { return gui.ShowWholeGitGraph },
func(value bool) { gui.ShowWholeGitGraph = value },
),
Remotes: controllers.NewRemotesController(
controllerCommon,
func() types.IListContext { return gui.State.Contexts.Remotes },