summaryrefslogtreecommitdiffstats
path: root/pkg/gui
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
parent935f77483443a12ab159e19a958dfdf61a947b36 (diff)
work towards more interactive rebase options
Diffstat (limited to 'pkg/gui')
-rw-r--r--pkg/gui/commits_panel.go125
-rw-r--r--pkg/gui/files_panel.go13
-rw-r--r--pkg/gui/keybindings.go40
3 files changed, 141 insertions, 37 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)
+}
diff --git a/pkg/gui/files_panel.go b/pkg/gui/files_panel.go
index 491b931e5..c6f5cd7d5 100644
--- a/pkg/gui/files_panel.go
+++ b/pkg/gui/files_panel.go
@@ -480,3 +480,16 @@ func (gui *Gui) anyFilesWithMergeConflicts() bool {
}
return false
}
+
+func (gui *Gui) handleSoftReset(g *gocui.Gui, v *gocui.View) error {
+ return gui.createConfirmationPanel(g, v, gui.Tr.SLocalize("SoftReset"), gui.Tr.SLocalize("ConfirmSoftReset"), func(g *gocui.Gui, v *gocui.View) error {
+ if err := gui.GitCommand.SoftReset("HEAD^"); err != nil {
+ return gui.createErrorPanel(g, err.Error())
+ }
+
+ if err := gui.refreshCommits(gui.g); err != nil {
+ return err
+ }
+ return gui.refreshFiles()
+ }, nil)
+}
diff --git a/pkg/gui/keybindings.go b/pkg/gui/keybindings.go
index c0becfe2b..ab70616ea 100644
--- a/pkg/gui/keybindings.go
+++ b/pkg/gui/keybindings.go
@@ -84,6 +84,12 @@ func (gui *Gui) GetInitialKeybindings() []*Binding {
Handler: gui.scrollDownMain,
}, {
ViewName: "",
+ Key: 'm',
+ Modifier: gocui.ModNone,
+ Handler: gui.handleCreateRebaseOptionsMenu,
+ Description: gui.Tr.SLocalize("ViewMergeRebaseOptions"),
+ }, {
+ ViewName: "",
Key: 'P',
Modifier: gocui.ModNone,
Handler: gui.pushFiles,
@@ -161,12 +167,6 @@ func (gui *Gui) GetInitialKeybindings() []*Binding {
Handler: gui.handleFileRemove,
Description: gui.Tr.SLocalize("removeFile"),
}, {
- ViewName: "files", // TODO: might make this for more views as well
- Key: 'm',
- Modifier: gocui.ModNone,
- Handler: gui.handleCreateRebaseOptionsMenu,
- Description: gui.Tr.SLocalize("ViewMergeRebaseOptions"),
- }, {
ViewName: "files",
Key: 'e',
Modifier: gocui.ModNone,
@@ -192,12 +192,18 @@ func (gui *Gui) GetInitialKeybindings() []*Binding {
Description: gui.Tr.SLocalize("refreshFiles"),
}, {
ViewName: "files",
- Key: 'S',
+ Key: 's',
Modifier: gocui.ModNone,
Handler: gui.handleStashSave,
Description: gui.Tr.SLocalize("stashFiles"),
}, {
ViewName: "files",
+ Key: 'S',
+ Modifier: gocui.ModNone,
+ Handler: gui.handleSoftReset,
+ Description: gui.Tr.SLocalize("softReset"),
+ }, {
+ ViewName: "files",
Key: 'a',
Modifier: gocui.ModNone,
Handler: gui.handleStageAll,
@@ -270,7 +276,7 @@ func (gui *Gui) GetInitialKeybindings() []*Binding {
Description: gui.Tr.SLocalize("rebaseBranch"),
}, {
ViewName: "branches",
- Key: 'm',
+ Key: 'M',
Modifier: gocui.ModNone,
Handler: gui.handleMerge,
Description: gui.Tr.SLocalize("mergeIntoCurrentBranch"),
@@ -335,6 +341,24 @@ func (gui *Gui) GetInitialKeybindings() []*Binding {
Handler: gui.handleCommitEdit,
Description: gui.Tr.SLocalize("editCommit"),
}, {
+ ViewName: "commits",
+ Key: 'A',
+ Modifier: gocui.ModNone,
+ Handler: gui.handleCommitAmendTo,
+ Description: gui.Tr.SLocalize("amendToCommit"),
+ }, {
+ ViewName: "commits",
+ Key: 'p',
+ Modifier: gocui.ModNone,
+ Handler: gui.handleCommitPick,
+ Description: gui.Tr.SLocalize("pickCommit"),
+ }, {
+ ViewName: "commits",
+ Key: 't',
+ Modifier: gocui.ModNone,
+ Handler: gui.handleCommitRevert,
+ Description: gui.Tr.SLocalize("revertCommit"),
+ }, {
ViewName: "stash",
Key: gocui.KeySpace,
Modifier: gocui.ModNone,