summaryrefslogtreecommitdiffstats
path: root/pkg/gui
diff options
context:
space:
mode:
authorJesse Duffield <jessedduffield@gmail.com>2019-04-02 19:53:16 +1100
committerJesse Duffield <jessedduffield@gmail.com>2019-05-06 22:44:38 +1000
commit5a0d0bb299eb2e4d693d3ecab506cc154e97678a (patch)
tree8c916afb93e7b5cae75b56c3c1431efa452dc29f /pkg/gui
parent2746b1bd38fa2668490a8db2369dec5146fbaec6 (diff)
support resetting to a commit in either soft, hard, or mixed mode
Diffstat (limited to 'pkg/gui')
-rw-r--r--pkg/gui/commits_panel.go51
-rw-r--r--pkg/gui/keybindings.go2
2 files changed, 51 insertions, 2 deletions
diff --git a/pkg/gui/commits_panel.go b/pkg/gui/commits_panel.go
index 98817bf59..c35b4adee 100644
--- a/pkg/gui/commits_panel.go
+++ b/pkg/gui/commits_panel.go
@@ -4,6 +4,7 @@ import (
"fmt"
"strconv"
+ "github.com/fatih/color"
"github.com/go-errors/errors"
"github.com/jesseduffield/gocui"
@@ -124,7 +125,8 @@ func (gui *Gui) handleResetToCommit(g *gocui.Gui, commitView *gocui.View) error
if commit == nil {
panic(errors.New(gui.Tr.SLocalize("NoCommitsThisBranch")))
}
- if err := gui.GitCommand.ResetToCommit(commit.Sha); err != nil {
+
+ if err := gui.GitCommand.ResetToCommit(commit.Sha, "mixed"); err != nil {
return gui.createErrorPanel(g, err.Error())
}
if err := gui.refreshCommits(g); err != nil {
@@ -554,3 +556,50 @@ func (gui *Gui) handleSquashAllAboveFixupCommits(g *gocui.Gui, v *gocui.View) er
})
}, nil)
}
+
+type resetOption struct {
+ description string
+ command string
+}
+
+// GetDisplayStrings is a function.
+func (r *resetOption) GetDisplayStrings(isFocused bool) []string {
+ return []string{r.description, color.New(color.FgRed).Sprint(r.command)}
+}
+
+func (gui *Gui) handleCreateCommitResetMenu(g *gocui.Gui, v *gocui.View) error {
+ commit := gui.getSelectedCommit(g)
+ if commit == nil {
+ return gui.createErrorPanel(gui.g, gui.Tr.SLocalize("NoCommitsThisBranch"))
+ }
+
+ strengths := []string{"soft", "mixed", "hard"}
+ options := make([]*resetOption, len(strengths))
+ for i, strength := range strengths {
+ options[i] = &resetOption{
+ description: fmt.Sprintf("%s reset", strength),
+ command: fmt.Sprintf("reset --%s %s", strength, commit.Sha),
+ }
+ }
+
+ handleMenuPress := func(index int) error {
+ if err := gui.GitCommand.ResetToCommit(commit.Sha, strengths[index]); err != nil {
+ return err
+ }
+
+ if err := gui.refreshCommits(g); err != nil {
+ return err
+ }
+ if err := gui.refreshFiles(); err != nil {
+ return err
+ }
+ if err := gui.resetOrigin(gui.getCommitsView()); err != nil {
+ return err
+ }
+
+ gui.State.Panels.Commits.SelectedLine = 0
+ return gui.handleCommitSelect(g, gui.getCommitsView())
+ }
+
+ return gui.createMenu(fmt.Sprintf("%s %s", gui.Tr.SLocalize("resetTo"), commit.Sha), options, len(options), handleMenuPress)
+}
diff --git a/pkg/gui/keybindings.go b/pkg/gui/keybindings.go
index 6bb32ea59..fd4ed7625 100644
--- a/pkg/gui/keybindings.go
+++ b/pkg/gui/keybindings.go
@@ -327,7 +327,7 @@ func (gui *Gui) GetInitialKeybindings() []*Binding {
ViewName: "commits",
Key: 'g',
Modifier: gocui.ModNone,
- Handler: gui.handleResetToCommit,
+ Handler: gui.handleCreateCommitResetMenu,
Description: gui.Tr.SLocalize("resetToThisCommit"),
}, {
ViewName: "commits",