summaryrefslogtreecommitdiffstats
path: root/pkg/gui/controllers/basic_commits_controller.go
diff options
context:
space:
mode:
authorJesse Duffield <jessedduffield@gmail.com>2022-03-26 16:42:56 +1100
committerJesse Duffield <jessedduffield@gmail.com>2022-03-26 17:22:42 +1100
commit45dab51214d7deca689279a6a162d80ee27befc8 (patch)
treefc06fe1b646f37f46ea2461f2b90f41235775ede /pkg/gui/controllers/basic_commits_controller.go
parent540edb0bf46df2dce32f9bcc554c482cfa0cbc7b (diff)
add basic commits controller for handling actions that apply to all commit contexts
Diffstat (limited to 'pkg/gui/controllers/basic_commits_controller.go')
-rw-r--r--pkg/gui/controllers/basic_commits_controller.go236
1 files changed, 236 insertions, 0 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)
+}