summaryrefslogtreecommitdiffstats
path: root/pkg/gui
diff options
context:
space:
mode:
authorJesse Duffield Duffield <jesseduffieldduffield@Jesses-MacBook-Pro-3.local>2019-02-24 09:42:24 +1100
committerJesse Duffield Duffield <jesseduffieldduffield@Jesses-MacBook-Pro-3.local>2019-02-24 10:58:15 +1100
commit95d451e59a419933f6e5f90305ffc6fe8dbc448f (patch)
tree25aba410c18655c6e59d80da4aef612c43193f7b /pkg/gui
parent6c1d2d45ef2d001e28ec31095826422ba7461664 (diff)
Make it easier to run sync/async commands, switch to interactive rebase when rebasing on branches
Diffstat (limited to 'pkg/gui')
-rw-r--r--pkg/gui/commit_message_panel.go26
-rw-r--r--pkg/gui/commits_panel.go10
-rw-r--r--pkg/gui/files_panel.go22
3 files changed, 30 insertions, 28 deletions
diff --git a/pkg/gui/commit_message_panel.go b/pkg/gui/commit_message_panel.go
index 130ec3401..b05a7df6c 100644
--- a/pkg/gui/commit_message_panel.go
+++ b/pkg/gui/commit_message_panel.go
@@ -1,28 +1,38 @@
package gui
import (
+ "os/exec"
"strconv"
"strings"
"github.com/jesseduffield/gocui"
)
-func (gui *Gui) handleCommitConfirm(g *gocui.Gui, v *gocui.View) error {
- message := gui.trimmedContent(v)
- if message == "" {
- return gui.createErrorPanel(g, gui.Tr.SLocalize("CommitWithoutMessageErr"))
- }
- sub, err := gui.GitCommand.Commit(message, false)
+// runSyncOrAsyncCommand takes the output of a command that may have returned
+// either no error, an error, or a subprocess to execute, and if a subprocess
+// needs to be set on the gui object, it does so, and then returns the error
+func (gui *Gui) runSyncOrAsyncCommand(sub *exec.Cmd, err error) error {
if err != nil {
- // TODO need to find a way to send through this error
if err != gui.Errors.ErrSubProcess {
- return gui.createErrorPanel(g, err.Error())
+ return gui.createErrorPanel(gui.g, err.Error())
}
}
if sub != nil {
gui.SubProcess = sub
return gui.Errors.ErrSubProcess
}
+ return nil
+}
+
+func (gui *Gui) handleCommitConfirm(g *gocui.Gui, v *gocui.View) error {
+ message := gui.trimmedContent(v)
+ if message == "" {
+ return gui.createErrorPanel(g, gui.Tr.SLocalize("CommitWithoutMessageErr"))
+ }
+ if err := gui.runSyncOrAsyncCommand(gui.GitCommand.Commit(message)); err != nil {
+ return err
+ }
+
v.Clear()
_ = v.SetCursor(0, 0)
_ = v.SetOrigin(0, 0)
diff --git a/pkg/gui/commits_panel.go b/pkg/gui/commits_panel.go
index a2f3e858c..383f9b6ba 100644
--- a/pkg/gui/commits_panel.go
+++ b/pkg/gui/commits_panel.go
@@ -212,6 +212,11 @@ func (gui *Gui) handleRenameCommitEditor(g *gocui.Gui, v *gocui.View) error {
// commit meaning you are trying to edit the todo file rather than actually
// begin a rebase. It then updates the todo file with that action
func (gui *Gui) handleMidRebaseCommand(action string) (bool, error) {
+ selectedCommit := gui.State.Commits[gui.State.Panels.Commits.SelectedLine]
+ if selectedCommit.Status != "rebasing" {
+ return false, nil
+ }
+
// for now we do not support setting 'reword' because it requires an editor
// and that means we either unconditionally wait around for the subprocess to ask for
// our input or we set a lazygit client as the EDITOR env variable and have it
@@ -220,10 +225,6 @@ func (gui *Gui) handleMidRebaseCommand(action string) (bool, error) {
return true, gui.createErrorPanel(gui.g, gui.Tr.SLocalize("rewordNotSupported"))
}
- selectedCommit := gui.State.Commits[gui.State.Panels.Commits.SelectedLine]
- if selectedCommit.Status != "rebasing" {
- return false, nil
- }
if err := gui.GitCommand.EditRebaseTodo(gui.State.Panels.Commits.SelectedLine, action); err != nil {
return false, gui.createErrorPanel(gui.g, err.Error())
}
@@ -318,6 +319,7 @@ func (gui *Gui) handleCommitEdit(g *gocui.Gui, v *gocui.View) error {
}
func (gui *Gui) handleCommitAmendTo(g *gocui.Gui, v *gocui.View) error {
+ // TODO: i18n
return gui.createConfirmationPanel(gui.g, v, "Amend Commit", "Are you sure you want to amend this commit with your staged files?", func(*gocui.Gui, *gocui.View) error {
err := gui.GitCommand.AmendTo(gui.State.Commits[gui.State.Panels.Commits.SelectedLine].Sha)
return gui.handleGenericMergeCommandResult(err)
diff --git a/pkg/gui/files_panel.go b/pkg/gui/files_panel.go
index c6f5cd7d5..1f57e91e8 100644
--- a/pkg/gui/files_panel.go
+++ b/pkg/gui/files_panel.go
@@ -287,18 +287,16 @@ func (gui *Gui) handleAmendCommitPress(g *gocui.Gui, filesView *gocui.View) erro
if len(gui.stagedFiles()) == 0 && gui.State.WorkingTreeState == "normal" {
return gui.createErrorPanel(g, gui.Tr.SLocalize("NoStagedFilesToCommit"))
}
- title := strings.Title(gui.Tr.SLocalize("AmendLastCommit"))
- question := gui.Tr.SLocalize("SureToAmend")
-
if len(gui.State.Commits) == 0 {
return gui.createErrorPanel(g, gui.Tr.SLocalize("NoCommitToAmend"))
}
+ title := strings.Title(gui.Tr.SLocalize("AmendLastCommit"))
+ question := gui.Tr.SLocalize("SureToAmend")
+
return gui.createConfirmationPanel(g, filesView, title, question, func(g *gocui.Gui, v *gocui.View) error {
- lastCommitMsg := gui.State.Commits[0].Name
- _, err := gui.GitCommand.Commit(lastCommitMsg, true)
- if err != nil {
- return gui.createErrorPanel(g, err.Error())
+ if err := gui.runSyncOrAsyncCommand(gui.GitCommand.AmendHead()); err != nil {
+ return err
}
return gui.refreshSidePanels(g)
@@ -324,15 +322,7 @@ func (gui *Gui) PrepareSubProcess(g *gocui.Gui, commands ...string) {
}
func (gui *Gui) editFile(filename string) error {
- sub, err := gui.OSCommand.EditFile(filename)
- if err != nil {
- return gui.createErrorPanel(gui.g, err.Error())
- }
- if sub != nil {
- gui.SubProcess = sub
- return gui.Errors.ErrSubProcess
- }
- return nil
+ return gui.runSyncOrAsyncCommand(gui.OSCommand.EditFile(filename))
}
func (gui *Gui) handleFileEdit(g *gocui.Gui, v *gocui.View) error {