summaryrefslogtreecommitdiffstats
path: root/pkg/gui/commits_panel.go
diff options
context:
space:
mode:
authorJesse Duffield <jessedduffield@gmail.com>2019-02-19 23:36:29 +1100
committerJesse Duffield <jessedduffield@gmail.com>2019-02-19 23:36:36 +1100
commit0228e250847d042730038281f435b0b21d992c42 (patch)
tree9f15ef6444c6215852a301a3286dcddf8a2b0cb3 /pkg/gui/commits_panel.go
parent935f77483443a12ab159e19a958dfdf61a947b36 (diff)
work towards more interactive rebase options
Diffstat (limited to 'pkg/gui/commits_panel.go')
-rw-r--r--pkg/gui/commits_panel.go125
1 files changed, 96 insertions, 29 deletions
diff --git a/pkg/gui/commits_panel.go b/pkg/gui/commits_panel.go
index f1d443731..a68b71bb1 100644
--- a/pkg/gui/commits_panel.go
+++ b/pkg/gui/commits_panel.go
@@ -115,24 +115,23 @@ func (gui *Gui) handleResetToCommit(g *gocui.Gui, commitView *gocui.View) error
}
func (gui *Gui) handleCommitSquashDown(g *gocui.Gui, v *gocui.View) error {
- if gui.State.Panels.Commits.SelectedLine != 0 {
- return gui.createErrorPanel(g, gui.Tr.SLocalize("OnlySquashTopmostCommit"))
- }
if len(gui.State.Commits) <= 1 {
return gui.createErrorPanel(g, gui.Tr.SLocalize("YouNoCommitsToSquash"))
}
- commit := gui.getSelectedCommit(g)
- if commit == nil {
- return errors.New(gui.Tr.SLocalize("NoCommitsThisBranch"))
- }
- if err := gui.GitCommand.SquashPreviousTwoCommits(commit.Name); err != nil {
- return gui.createErrorPanel(g, err.Error())
+
+ applied, err := gui.handleMidRebaseCommand("squash")
+ if err != nil {
+ return err
}
- if err := gui.refreshCommits(g); err != nil {
- panic(err)
+ if applied {
+ return nil
}
- gui.refreshStatus(g)
- return gui.handleCommitSelect(g, v)
+
+ gui.createConfirmationPanel(g, v, gui.Tr.SLocalize("Squash"), gui.Tr.SLocalize("SureSquashThisCommit"), func(g *gocui.Gui, v *gocui.View) error {
+ err := gui.GitCommand.InteractiveRebase(gui.State.Commits, gui.State.Panels.Commits.SelectedLine, "squash")
+ return gui.handleGenericMergeCommandResult(err)
+ }, nil)
+ return nil
}
// TODO: move to files panel
@@ -149,28 +148,31 @@ func (gui *Gui) handleCommitFixup(g *gocui.Gui, v *gocui.View) error {
if len(gui.State.Commits) <= 1 {
return gui.createErrorPanel(g, gui.Tr.SLocalize("YouNoCommitsToSquash"))
}
- if gui.anyUnStagedChanges(gui.State.Files) {
- return gui.createErrorPanel(g, gui.Tr.SLocalize("CantFixupWhileUnstagedChanges"))
+
+ applied, err := gui.handleMidRebaseCommand("fixup")
+ if err != nil {
+ return err
}
- branch := gui.State.Branches[0]
- commit := gui.getSelectedCommit(g)
- if commit == nil {
- return gui.createErrorPanel(g, gui.Tr.SLocalize("NoCommitsThisBranch"))
+ if applied {
+ return nil
}
- message := gui.Tr.SLocalize("SureFixupThisCommit")
- gui.createConfirmationPanel(g, v, gui.Tr.SLocalize("Fixup"), message, func(g *gocui.Gui, v *gocui.View) error {
- if err := gui.GitCommand.SquashFixupCommit(branch.Name, commit.Sha); err != nil {
- return gui.createErrorPanel(g, err.Error())
- }
- if err := gui.refreshCommits(g); err != nil {
- panic(err)
- }
- return gui.refreshStatus(g)
+
+ gui.createConfirmationPanel(g, v, gui.Tr.SLocalize("Fixup"), gui.Tr.SLocalize("SureFixupThisCommit"), func(g *gocui.Gui, v *gocui.View) error {
+ err := gui.GitCommand.InteractiveRebase(gui.State.Commits, gui.State.Panels.Commits.SelectedLine, "fixup")
+ return gui.handleGenericMergeCommandResult(err)
}, nil)
return nil
}
func (gui *Gui) handleRenameCommit(g *gocui.Gui, v *gocui.View) error {
+ applied, err := gui.handleMidRebaseCommand("reword")
+ if err != nil {
+ return err
+ }
+ if applied {
+ return nil
+ }
+
if gui.State.Panels.Commits.SelectedLine != 0 {
return gui.createErrorPanel(g, gui.Tr.SLocalize("OnlyRenameTopCommit"))
}
@@ -186,6 +188,14 @@ func (gui *Gui) handleRenameCommit(g *gocui.Gui, v *gocui.View) error {
}
func (gui *Gui) handleRenameCommitEditor(g *gocui.Gui, v *gocui.View) error {
+ applied, err := gui.handleMidRebaseCommand("reword")
+ if err != nil {
+ return err
+ }
+ if applied {
+ return nil
+ }
+
subProcess, err := gui.GitCommand.RewordCommit(gui.State.Commits, gui.State.Panels.Commits.SelectedLine)
if err != nil {
return gui.createErrorPanel(gui.g, err.Error())
@@ -198,7 +208,29 @@ func (gui *Gui) handleRenameCommitEditor(g *gocui.Gui, v *gocui.View) error {
return nil
}
+// handleMidRebaseCommand sees if the selected commit is in fact a rebasing
+// 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
+ }
+ if err := gui.GitCommand.EditRebaseTodo(gui.State.Panels.Commits.SelectedLine, action); err != nil {
+ return false, gui.createErrorPanel(gui.g, err.Error())
+ }
+ return true, gui.refreshCommits(gui.g)
+}
+
func (gui *Gui) handleCommitDelete(g *gocui.Gui, v *gocui.View) error {
+ applied, err := gui.handleMidRebaseCommand("drop")
+ if err != nil {
+ return err
+ }
+ if applied {
+ return nil
+ }
+
// TODO: i18n
return gui.createConfirmationPanel(gui.g, v, "Delete Commit", "Are you sure you want to delete this commit?", func(*gocui.Gui, *gocui.View) error {
err := gui.GitCommand.InteractiveRebase(gui.State.Commits, gui.State.Panels.Commits.SelectedLine, "drop")
@@ -225,6 +257,41 @@ func (gui *Gui) handleCommitMoveUp(g *gocui.Gui, v *gocui.View) error {
}
func (gui *Gui) handleCommitEdit(g *gocui.Gui, v *gocui.View) error {
- err := gui.GitCommand.InteractiveRebase(gui.State.Commits, gui.State.Panels.Commits.SelectedLine, "edit")
+ applied, err := gui.handleMidRebaseCommand("edit")
+ if err != nil {
+ return err
+ }
+ if applied {
+ return nil
+ }
+
+ err = gui.GitCommand.InteractiveRebase(gui.State.Commits, gui.State.Panels.Commits.SelectedLine, "edit")
return gui.handleGenericMergeCommandResult(err)
}
+
+func (gui *Gui) handleCommitAmendTo(g *gocui.Gui, v *gocui.View) error {
+ err := gui.GitCommand.AmendTo(gui.State.Commits[gui.State.Panels.Commits.SelectedLine].Sha)
+ return gui.handleGenericMergeCommandResult(err)
+}
+
+func (gui *Gui) handleCommitPick(g *gocui.Gui, v *gocui.View) error {
+ applied, err := gui.handleMidRebaseCommand("pick")
+ if err != nil {
+ return err
+ }
+ if applied {
+ return nil
+ }
+
+ // at this point we aren't actually rebasing so we will interpret this as an
+ // attempt to pull. We might revoke this later after enabling configurable keybindings
+ return gui.pullFiles(g, v)
+}
+
+func (gui *Gui) handleCommitRevert(g *gocui.Gui, v *gocui.View) error {
+ if err := gui.GitCommand.Revert(gui.State.Commits[gui.State.Panels.Commits.SelectedLine].Sha); err != nil {
+ return gui.createErrorPanel(gui.g, err.Error())
+ }
+ gui.State.Panels.Commits.SelectedLine++
+ return gui.refreshCommits(gui.g)
+}