From 5a0d0bb299eb2e4d693d3ecab506cc154e97678a Mon Sep 17 00:00:00 2001 From: Jesse Duffield Date: Tue, 2 Apr 2019 19:53:16 +1100 Subject: support resetting to a commit in either soft, hard, or mixed mode --- pkg/gui/commits_panel.go | 51 +++++++++++++++++++++++++++++++++++++++++++++++- pkg/gui/keybindings.go | 2 +- 2 files changed, 51 insertions(+), 2 deletions(-) (limited to 'pkg/gui') 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", -- cgit v1.2.3