diff options
author | Jesse Duffield <jessedduffield@gmail.com> | 2022-03-26 16:42:56 +1100 |
---|---|---|
committer | Jesse Duffield <jessedduffield@gmail.com> | 2022-03-26 17:22:42 +1100 |
commit | 45dab51214d7deca689279a6a162d80ee27befc8 (patch) | |
tree | fc06fe1b646f37f46ea2461f2b90f41235775ede /pkg/gui/controllers | |
parent | 540edb0bf46df2dce32f9bcc554c482cfa0cbc7b (diff) |
add basic commits controller for handling actions that apply to all commit contexts
Diffstat (limited to 'pkg/gui/controllers')
-rw-r--r-- | pkg/gui/controllers/basic_commits_controller.go | 236 | ||||
-rw-r--r-- | pkg/gui/controllers/local_commits_controller.go | 166 | ||||
-rw-r--r-- | pkg/gui/controllers/reflog_controller.go | 103 | ||||
-rw-r--r-- | pkg/gui/controllers/sub_commits_controller.go | 114 |
4 files changed, 236 insertions, 383 deletions
diff --git a/pkg/gui/controllers/basic_commits_controller.go b/pkg/gui/controllers/basic_commits_controller.go new file mode 100644 index 000000000..c59686126 --- /dev/null +++ b/pkg/gui/controllers/basic_commits_controller.go @@ -0,0 +1,236 @@ +package controllers + +import ( + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +// This controller is for all contexts that contain a list of commits. + +type BasicCommitsControllerFactory struct { + controllerCommon *controllerCommon +} + +var _ types.IController = &BasicCommitsController{} + +type ContainsCommits interface { + types.Context + GetSelected() *models.Commit + GetCommits() []*models.Commit + GetSelectedLineIdx() int +} + +type BasicCommitsController struct { + baseController + *controllerCommon + context ContainsCommits +} + +func NewBasicCommitsControllerFactory( + common *controllerCommon, +) *BasicCommitsControllerFactory { + return &BasicCommitsControllerFactory{ + controllerCommon: common, + } +} + +func (self *BasicCommitsControllerFactory) Create(context ContainsCommits) *BasicCommitsController { + return &BasicCommitsController{ + baseController: baseController{}, + controllerCommon: self.controllerCommon, + context: context, + } +} + +func (self *BasicCommitsController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding { + bindings := []*types.Binding{ + { + Key: opts.GetKey(opts.Config.Commits.CheckoutCommit), + Handler: self.checkSelected(self.checkout), + Description: self.c.Tr.LcCheckoutCommit, + }, + { + Key: opts.GetKey(opts.Config.Commits.CopyCommitAttributeToClipboard), + Handler: self.checkSelected(self.copyCommitAttribute), + Description: self.c.Tr.LcCopyCommitAttributeToClipboard, + OpensMenu: true, + }, + { + Key: opts.GetKey(opts.Config.Commits.OpenInBrowser), + Handler: self.checkSelected(self.openInBrowser), + Description: self.c.Tr.LcOpenCommitInBrowser, + }, + { + Key: opts.GetKey(opts.Config.Universal.New), + Modifier: gocui.ModNone, + Handler: self.checkSelected(self.newBranch), + Description: self.c.Tr.LcCreateNewBranchFromCommit, + }, + { + Key: opts.GetKey(opts.Config.Commits.ViewResetOptions), + Handler: self.checkSelected(self.createResetMenu), + Description: self.c.Tr.LcResetToThisCommit, + }, + { + Key: opts.GetKey(opts.Config.Commits.CherryPickCopy), + Handler: self.checkSelected(self.copy), + Description: self.c.Tr.LcCherryPickCopy, + }, + { + Key: opts.GetKey(opts.Config.Commits.CherryPickCopyRange), + Handler: self.checkSelected(self.copyRange), + Description: self.c.Tr.LcCherryPickCopyRange, + }, + { + Key: opts.GetKey(opts.Config.Commits.ResetCherryPick), + Handler: self.helpers.CherryPick.Reset, + Description: self.c.Tr.LcResetCherryPick, + }, + } + + return bindings +} + +func (self *BasicCommitsController) checkSelected(callback func(*models.Commit) error) func() error { + return func() error { + commit := self.context.GetSelected() + if commit == nil { + return nil + } + + return callback(commit) + } +} + +func (self *BasicCommitsController) Context() types.Context { + return self.context +} + +func (self *BasicCommitsController) copyCommitAttribute(commit *models.Commit) error { + return self.c.Menu(types.CreateMenuOptions{ + Title: self.c.Tr.Actions.CopyCommitAttributeToClipboard, + Items: []*types.MenuItem{ + { + DisplayString: self.c.Tr.LcCommitSha, + OnPress: func() error { + return self.copyCommitSHAToClipboard(commit) + }, + }, + { + DisplayString: self.c.Tr.LcCommitURL, + OnPress: func() error { + return self.copyCommitURLToClipboard(commit) + }, + }, + { + DisplayString: self.c.Tr.LcCommitDiff, + OnPress: func() error { + return self.copyCommitDiffToClipboard(commit) + }, + }, + { + DisplayString: self.c.Tr.LcCommitMessage, + OnPress: func() error { + return self.copyCommitMessageToClipboard(commit) + }, + }, + }, + }) +} + +func (self *BasicCommitsController) copyCommitSHAToClipboard(commit *models.Commit) error { + self.c.LogAction(self.c.Tr.Actions.CopyCommitSHAToClipboard) + if err := self.os.CopyToClipboard(commit.Sha); err != nil { + return self.c.Error(err) + } + + self.c.Toast(self.c.Tr.CommitSHACopiedToClipboard) + return nil +} + +func (self *BasicCommitsController) copyCommitURLToClipboard(commit *models.Commit) error { + url, err := self.helpers.Host.GetCommitURL(commit.Sha) + if err != nil { + return err + } + + self.c.LogAction(self.c.Tr.Actions.CopyCommitURLToClipboard) + if err := self.os.CopyToClipboard(url); err != nil { + return self.c.Error(err) + } + + self.c.Toast(self.c.Tr.CommitURLCopiedToClipboard) + return nil +} + +func (self *BasicCommitsController) copyCommitDiffToClipboard(commit *models.Commit) error { + diff, err := self.git.Commit.GetCommitDiff(commit.Sha) + if err != nil { + return self.c.Error(err) + } + + self.c.LogAction(self.c.Tr.Actions.CopyCommitDiffToClipboard) + if err := self.os.CopyToClipboard(diff); err != nil { + return self.c.Error(err) + } + + self.c.Toast(self.c.Tr.CommitDiffCopiedToClipboard) + return nil +} + +func (self *BasicCommitsController) copyCommitMessageToClipboard(commit *models.Commit) error { + message, err := self.git.Commit.GetCommitMessage(commit.Sha) + if err != nil { + return self.c.Error(err) + } + + self.c.LogAction(self.c.Tr.Actions.CopyCommitMessageToClipboard) + if err := self.os.CopyToClipboard(message); err != nil { + return self.c.Error(err) + } + + self.c.Toast(self.c.Tr.CommitMessageCopiedToClipboard) + return nil +} + +func (self *BasicCommitsController) openInBrowser(commit *models.Commit) error { + url, err := self.helpers.Host.GetCommitURL(commit.Sha) + if err != nil { + return self.c.Error(err) + } + + self.c.LogAction(self.c.Tr.Actions.OpenCommitInBrowser) + if err := self.os.OpenLink(url); err != nil { + return self.c.Error(err) + } + + return nil +} + +func (self *BasicCommitsController) newBranch(commit *models.Commit) error { + return self.helpers.Refs.NewBranch(commit.RefName(), commit.Description(), "") +} + +func (self *BasicCommitsController) createResetMenu(commit *models.Commit) error { + return self.helpers.Refs.CreateGitResetMenu(commit.Sha) +} + +func (self *BasicCommitsController) checkout(commit *models.Commit) error { + return self.c.Ask(types.AskOpts{ + Title: self.c.Tr.LcCheckoutCommit, + Prompt: self.c.Tr.SureCheckoutThisCommit, + HandleConfirm: func() error { + self.c.LogAction(self.c.Tr.Actions.CheckoutCommit) + return self.helpers.Refs.CheckoutRef(commit.Sha, types.CheckoutRefOptions{}) + }, + }) +} + +func (self *BasicCommitsController) copy(commit *models.Commit) error { + return self.helpers.CherryPick.Copy(commit, self.context.GetCommits(), self.context) +} + +func (self *BasicCommitsController) copyRange(*models.Commit) error { + return self.helpers.CherryPick.CopyRange(self.context.GetSelectedLineIdx(), self.model.Commits, self.context) +} diff --git a/pkg/gui/controllers/local_commits_controller.go b/pkg/gui/controllers/local_commits_controller.go index 2c3618b82..41433068d 100644 --- a/pkg/gui/controllers/local_commits_controller.go +++ b/pkg/gui/controllers/local_commits_controller.go @@ -3,7 +3,6 @@ package controllers import ( "fmt" - "github.com/jesseduffield/gocui" "github.com/jesseduffield/lazygit/pkg/commands/models" "github.com/jesseduffield/lazygit/pkg/gui/context" "github.com/jesseduffield/lazygit/pkg/gui/types" @@ -102,22 +101,6 @@ func (self *LocalCommitsController) GetKeybindings(opts types.KeybindingsOpts) [ Description: self.c.Tr.LcRevertCommit, }, { - Key: opts.GetKey(opts.Config.Universal.New), - Modifier: gocui.ModNone, - Handler: self.checkSelected(self.newBranch), - Description: self.c.Tr.LcCreateNewBranchFromCommit, - }, - { - Key: opts.GetKey(opts.Config.Commits.CherryPickCopy), - Handler: self.checkSelected(self.copy), - Description: self.c.Tr.LcCherryPickCopy, - }, - { - Key: opts.GetKey(opts.Config.Commits.CherryPickCopyRange), - Handler: self.checkSelected(self.copyRange), - Description: self.c.Tr.LcCherryPickCopyRange, - }, - { Key: opts.GetKey(opts.Config.Commits.PasteCommits), Handler: opts.Guards.OutsideFilterMode(self.paste), Description: self.c.Tr.LcPasteCommits, @@ -150,31 +133,10 @@ func (self *LocalCommitsController) GetKeybindings(opts types.KeybindingsOpts) [ OpensMenu: true, }, { - Key: opts.GetKey(opts.Config.Commits.ViewResetOptions), - Handler: self.checkSelected(self.createResetMenu), - Description: self.c.Tr.LcResetToThisCommit, - }, - { - Key: opts.GetKey(opts.Config.Commits.CheckoutCommit), - Handler: self.checkSelected(self.checkout), - Description: self.c.Tr.LcCheckoutCommit, - }, - { Key: opts.GetKey(opts.Config.Commits.TagCommit), Handler: self.checkSelected(self.createTag), Description: self.c.Tr.LcTagCommit, }, - { - Key: opts.GetKey(opts.Config.Commits.CopyCommitAttributeToClipboard), - Handler: self.checkSelected(self.copyCommitAttribute), - Description: self.c.Tr.LcCopyCommitAttributeToClipboard, - OpensMenu: true, - }, - { - Key: opts.GetKey(opts.Config.Commits.OpenInBrowser), - Handler: self.checkSelected(self.openInBrowser), - Description: self.c.Tr.LcOpenCommitInBrowser, - }, }...) return bindings @@ -557,21 +519,6 @@ func (self *LocalCommitsController) createTag(commit *models.Commit) error { return self.helpers.Tags.CreateTagMenu(commit.Sha, func() {}) } -func (self *LocalCommitsController) checkout(commit *models.Commit) error { - return self.c.Ask(types.AskOpts{ - Title: self.c.Tr.LcCheckoutCommit, - Prompt: self.c.Tr.SureCheckoutThisCommit, - HandleConfirm: func() error { - self.c.LogAction(self.c.Tr.Actions.CheckoutCommit) - return self.helpers.Refs.CheckoutRef(commit.Sha, types.CheckoutRefOptions{}) - }, - }) -} - -func (self *LocalCommitsController) createResetMenu(commit *models.Commit) error { - return self.helpers.Refs.CreateGitResetMenu(commit.Sha) -} - func (self *LocalCommitsController) openSearch() error { // we usually lazyload these commits but now that we're searching we need to load them now if self.context().GetLimitCommits() { @@ -600,93 +547,6 @@ func (self *LocalCommitsController) gotoBottom() error { return nil } -func (self *LocalCommitsController) copyCommitAttribute(commit *models.Commit) error { - return self.c.Menu(types.CreateMenuOptions{ - Title: self.c.Tr.Actions.CopyCommitAttributeToClipboard, - Items: []*types.MenuItem{ - { - DisplayString: self.c.Tr.LcCommitSha, - OnPress: func() error { - return self.copyCommitSHAToClipboard(commit) - }, - }, - { - DisplayString: self.c.Tr.LcCommitURL, - OnPress: func() error { - return self.copyCommitURLToClipboard(commit) - }, - }, - { - DisplayString: self.c.Tr.LcCommitDiff, - OnPress: func() error { - return self.copyCommitDiffToClipboard(commit) - }, - }, - { - DisplayString: self.c.Tr.LcCommitMessage, - OnPress: func() error { - return self.copyCommitMessageToClipboard(commit) - }, - }, - }, - }) -} - -func (self *LocalCommitsController) copyCommitSHAToClipboard(commit *models.Commit) error { - self.c.LogAction(self.c.Tr.Actions.CopyCommitSHAToClipboard) - if err := self.os.CopyToClipboard(commit.Sha); err != nil { - return self.c.Error(err) - } - - self.c.Toast(self.c.Tr.CommitSHACopiedToClipboard) - return nil -} - -func (self *LocalCommitsController) copyCommitURLToClipboard(commit *models.Commit) error { - url, err := self.helpers.Host.GetCommitURL(commit.Sha) - if err != nil { - return err - } - - self.c.LogAction(self.c.Tr.Actions.CopyCommitURLToClipboard) - if err := self.os.CopyToClipboard(url); err != nil { - return self.c.Error(err) - } - - self.c.Toast(self.c.Tr.CommitURLCopiedToClipboard) - return nil -} - -func (self *LocalCommitsController) copyCommitDiffToClipboard(commit *models.Commit) error { - diff, err := self.git.Commit.GetCommitDiff(commit.Sha) - if err != nil { - return self.c.Error(err) - } - - self.c.LogAction(self.c.Tr.Actions.CopyCommitDiffToClipboard) - if err := self.os.CopyToClipboard(diff); err != nil { - return self.c.Error(err) - } - - self.c.Toast(self.c.Tr.CommitDiffCopiedToClipboard) - return nil -} - -func (self *LocalCommitsController) copyCommitMessageToClipboard(commit *models.Commit) error { - message, err := self.git.Commit.GetCommitMessage(commit.Sha) - if err != nil { - return self.c.Error(err) - } - - self.c.LogAction(self.c.Tr.Actions.CopyCommitMessageToClipboard) - if err := self.os.CopyToClipboard(message); err != nil { - return self.c.Error(err) - } - - self.c.Toast(self.c.Tr.CommitMessageCopiedToClipboard) - return nil -} - func (self *LocalCommitsController) handleOpenLogMenu() error { return self.c.Menu(types.CreateMenuOptions{ Title: self.c.Tr.LogMenuTitle, @@ -770,20 +630,6 @@ func (self *LocalCommitsController) handleOpenLogMenu() error { }) } -func (self *LocalCommitsController) openInBrowser(commit *models.Commit) error { - url, err := self.helpers.Host.GetCommitURL(commit.Sha) - if err != nil { - return self.c.Error(err) - } - - self.c.LogAction(self.c.Tr.Actions.OpenCommitInBrowser) - if err := self.os.OpenLink(url); err != nil { - return self.c.Error(err) - } - - return nil -} - func (self *LocalCommitsController) checkSelected(callback func(*models.Commit) error) func() error { return func() error { commit := self.context().GetSelected() @@ -803,18 +649,6 @@ func (self *LocalCommitsController) context() *context.LocalCommitsContext { return self.contexts.LocalCommits } -func (self *LocalCommitsController) newBranch(commit *models.Commit) error { - return self.helpers.Refs.NewBranch(commit.RefName(), commit.Description(), "") -} - -func (self *LocalCommitsController) copy(commit *models.Commit) error { - return self.helpers.CherryPick.Copy(commit, self.model.Commits, self.context()) -} - -func (self *LocalCommitsController) copyRange(*models.Commit) error { - return self.helpers.CherryPick.CopyRange(self.context().GetSelectedLineIdx(), self.model.Commits, self.context()) -} - func (self *LocalCommitsController) paste() error { return self.helpers.CherryPick.Paste() } diff --git a/pkg/gui/controllers/reflog_controller.go b/pkg/gui/controllers/reflog_controller.go deleted file mode 100644 index 4085df635..000000000 --- a/pkg/gui/controllers/reflog_controller.go +++ /dev/null @@ -1,103 +0,0 @@ -package controllers - -import ( - "github.com/jesseduffield/lazygit/pkg/commands/models" - "github.com/jesseduffield/lazygit/pkg/gui/context" - "github.com/jesseduffield/lazygit/pkg/gui/types" -) - -type ReflogController struct { - baseController - *controllerCommon -} - -var _ types.IController = &ReflogController{} - -func NewReflogController( - common *controllerCommon, -) *ReflogController { - return &ReflogController{ - baseController: baseController{}, - controllerCommon: common, - } -} - -func (self *ReflogController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding { - bindings := []*types.Binding{ - { - Key: opts.GetKey(opts.Config.Universal.Select), - Handler: self.checkSelected(self.checkout), - Description: self.c.Tr.LcCheckoutCommit, - }, - { - Key: opts.GetKey(opts.Config.Commits.ViewResetOptions), - Handler: self.checkSelected(self.openResetMenu), - Description: self.c.Tr.LcViewResetOptions, - OpensMenu: true, - }, - { - Key: opts.GetKey(opts.Config.Commits.CherryPickCopy), - Handler: opts.Guards.OutsideFilterMode(self.checkSelected(self.copy)), - Description: self.c.Tr.LcCherryPickCopy, - }, - { - Key: opts.GetKey(opts.Config.Commits.CherryPickCopyRange), - Handler: opts.Guards.OutsideFilterMode(self.checkSelected(self.copyRange)), - Description: self.c.Tr.LcCherryPickCopyRange, - }, - { - Key: opts.GetKey(opts.Config.Commits.ResetCherryPick), - Handler: self.helpers.CherryPick.Reset, - Description: self.c.Tr.LcResetCherryPick, - }, - } - - return bindings -} - -func (self *ReflogController) checkSelected(callback func(*models.Commit) error) func() error { - return func() error { - commit := self.context().GetSelected() - if commit == nil { - return nil - } - - return callback(commit) - } -} - -func (self *ReflogController) Context() types.Context { - return self.context() -} - -func (self *ReflogController) context() *context.ReflogCommitsContext { - return self.contexts.ReflogCommits -} - -func (self *ReflogController) checkout(commit *models.Commit) error { - err := self.c.Ask(types.AskOpts{ - Title: self.c.Tr.LcCheckoutCommit, - Prompt: self.c.Tr.SureCheckoutThisCommit, - HandleConfirm: func() error { - self.c.LogAction(self.c.Tr.Actions.CheckoutReflogCommit) - return self.helpers.Refs.CheckoutRef(commit.Sha, types.CheckoutRefOptions{}) - }, - }) - if err != nil { - return err - } - - return nil -} - -func (self *ReflogController) openResetMenu(commit *models.Commit) error { - return self.helpers.Refs.CreateGitResetMenu(commit.Sha) -} - -func (self *ReflogController) copy(commit *models.Commit) error { - return self.helpers.CherryPick.Copy(commit, self.model.FilteredReflogCommits, self.context()) -} - -func (self *ReflogController) copyRange(commit *models.Commit) error { - return self.helpers.CherryPick.CopyRange(self.context().GetSelectedLineIdx(), self.model.FilteredReflogCommits, self.context()) -} diff --git a/pkg/gui/controllers/sub_commits_controller.go b/pkg/gui/controllers/sub_commits_controller.go deleted file mode 100644 index 36d8b2315..000000000 --- a/pkg/gui/controllers/sub_commits_controller.go +++ /dev/null @@ -1,114 +0,0 @@ -package controllers - -import ( - "github.com/jesseduffield/lazygit/pkg/commands/models" - "github.com/jesseduffield/lazygit/pkg/gui/context" - "github.com/jesseduffield/lazygit/pkg/gui/types" -) - -type SubCommitsController struct { - baseController - *controllerCommon -} - -var _ types.IController = &SubCommitsController{} - -func NewSubCommitsController( - common *controllerCommon, -) *SubCommitsController { - return &SubCommitsController{ - baseController: baseController{}, - controllerCommon: common, - } -} - -func (self *SubCommitsController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding { - bindings := []*types.Binding{ - { - Key: opts.GetKey(opts.Config.Universal.Select), - Handler: self.checkSelected(self.checkout), - Description: self.c.Tr.LcCheckoutCommit, - }, - { - Key: opts.GetKey(opts.Config.Commits.ViewResetOptions), - Handler: self.checkSelected(self.openResetMenu), - Description: self.c.Tr.LcViewResetOptions, - OpensMenu: true, - }, - { - Key: opts.GetKey(opts.Config.Universal.New), - Handler: self.checkSelected(self.newBranch), - Description: self.c.Tr.LcNewBranch, - }, - { - Key: opts.GetKey(opts.Config.Commits.CherryPickCopy), - Handler: self.checkSelected(self.copy), - Description: self.c.Tr.LcCherryPickCopy, - }, - { - Key: opts.GetKey(opts.Config.Commits.CherryPickCopyRange), - Handler: self.checkSelected(self.copyRange), - Description: self.c.Tr.LcCherryPickCopyRange, - }, - { - Key: opts.GetKey(opts.Config.Commits.ResetCherryPick), - Handler: self.helpers.CherryPick.Reset, - Description: self.c.Tr.LcResetCherryPick, - }, - } - - return bindings -} - -func (self *SubCommitsController) checkSelected(callback func(*models.Commit) error) func() error { - return func() error { - commit := self.context().GetSelected() - if commit == nil { - return nil - } - - return callback(commit) - } -} - -func (self *SubCommitsController) Context() types.Context { - return self.context() -} - -func (self *SubCommitsController) context() *context.SubCommitsContext { - return self.contexts.SubCommits -} - -func (self *SubCommitsController) checkout(commit *models.Commit) error { - err := self.c.Ask(types.AskOpts{ - Title: self.c.Tr.LcCheckoutCommit, - Prompt: self.c.Tr.SureCheckoutThisCommit, - HandleConfirm: func() error { - self.c.LogAction(self.c.Tr.Actions.CheckoutCommit) - return self.helpers.Refs.CheckoutRef(commit.Sha, types.CheckoutRefOptions{}) - }, - }) - if err != nil { - return err - } - - self.context().SetSelectedLineIdx(0) - - return nil -} - -func (self *SubCommitsController) openResetMenu(commit *models.Commit) error { - return self.helpers.Refs.CreateGitResetMenu(commit.Sha) -} - -func (self *SubCommitsController) newBranch(commit *models.Commit) error { - return self.helpers.Refs.NewBranch(commit.RefName(), commit.Description(), "") -} - -func (self *SubCommitsController) copy(commit *models.Commit) error { - return self.helpers.CherryPick.Copy(commit, self.model.SubCommits, self.context()) -} - -func (self *SubCommitsController) copyRange(commit *models.Commit) error { - return self.helpers.CherryPick.CopyRange(self.context().GetSelectedLineIdx(), self.model.SubCommits, self.context()) -} |