From 0228e250847d042730038281f435b0b21d992c42 Mon Sep 17 00:00:00 2001 From: Jesse Duffield Date: Tue, 19 Feb 2019 23:36:29 +1100 Subject: work towards more interactive rebase options --- pkg/gui/commits_panel.go | 125 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 96 insertions(+), 29 deletions(-) (limited to 'pkg/gui/commits_panel.go') 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) +} -- cgit v1.2.3