1
0
mirror of https://github.com/jesseduffield/lazygit.git synced 2024-12-12 11:15:00 +02:00
lazygit/pkg/gui/patch_options_panel.go

155 lines
4.4 KiB
Go
Raw Normal View History

package gui
import (
"fmt"
"github.com/jesseduffield/gocui"
)
func (gui *Gui) handleCreatePatchOptionsMenu(g *gocui.Gui, v *gocui.View) error {
if !gui.GitCommand.PatchManager.CommitSelected() {
2020-03-28 02:47:54 +02:00
return gui.createErrorPanel(gui.Tr.SLocalize("NoPatchError"))
}
2020-02-14 14:32:52 +02:00
menuItems := []*menuItem{
{
displayString: fmt.Sprintf("remove patch from original commit (%s)", gui.GitCommand.PatchManager.CommitSha),
onPress: gui.handleDeletePatchFromCommit,
},
{
displayString: "pull patch out into index",
onPress: gui.handlePullPatchIntoWorkingTree,
},
2020-03-26 12:00:08 +02:00
{
displayString: "apply patch",
2020-03-29 23:49:20 +02:00
onPress: func() error { return gui.handleApplyPatch(false) },
},
{
displayString: "apply patch in reverse",
onPress: func() error { return gui.handleApplyPatch(true) },
2020-03-26 12:00:08 +02:00
},
2020-02-14 14:32:52 +02:00
{
displayString: "reset patch",
onPress: gui.handleResetPatch,
},
}
selectedCommit := gui.getSelectedCommit()
2019-11-05 02:55:04 +02:00
if selectedCommit != nil && gui.GitCommand.PatchManager.CommitSha != selectedCommit.Sha {
2019-11-05 03:42:19 +02:00
// adding this option to index 1
2020-02-14 14:32:52 +02:00
menuItems = append(
menuItems[:1],
2019-11-05 03:42:19 +02:00
append(
2020-02-14 14:32:52 +02:00
[]*menuItem{
2019-11-05 03:42:19 +02:00
{
2020-02-14 14:32:52 +02:00
displayString: fmt.Sprintf("move patch to selected commit (%s)", selectedCommit.Sha),
onPress: gui.handleMovePatchToSelectedCommit,
2019-11-05 03:42:19 +02:00
},
2020-02-14 14:32:52 +02:00
}, menuItems[1:]...,
2019-11-05 03:42:19 +02:00
)...,
)
}
2020-02-14 14:39:02 +02:00
return gui.createMenu(gui.Tr.SLocalize("PatchOptionsTitle"), menuItems, createMenuOptions{showCancel: true})
}
func (gui *Gui) getPatchCommitIndex() int {
for index, commit := range gui.State.Commits {
2019-11-05 02:55:04 +02:00
if commit.Sha == gui.GitCommand.PatchManager.CommitSha {
return index
}
}
return -1
}
func (gui *Gui) validateNormalWorkingTreeState() (bool, error) {
if gui.GitCommand.WorkingTreeState() != "normal" {
return false, gui.createErrorPanel(gui.Tr.SLocalize("CantPatchWhileRebasingError"))
}
if gui.GitCommand.WorkingTreeState() != "normal" {
2020-03-28 02:47:54 +02:00
return false, gui.createErrorPanel(gui.Tr.SLocalize("CantPatchWhileRebasingError"))
}
return true, nil
}
func (gui *Gui) returnFocusFromLineByLinePanelIfNecessary() error {
2019-11-16 03:41:04 +02:00
if gui.State.MainContext == "patch-building" {
return gui.handleEscapePatchBuildingPanel(gui.g, nil)
}
return nil
}
func (gui *Gui) handleDeletePatchFromCommit() error {
if ok, err := gui.validateNormalWorkingTreeState(); !ok {
return err
}
if err := gui.returnFocusFromLineByLinePanelIfNecessary(); err != nil {
return err
}
return gui.WithWaitingStatus(gui.Tr.SLocalize("RebasingStatus"), func() error {
commitIndex := gui.getPatchCommitIndex()
2019-11-05 02:55:04 +02:00
err := gui.GitCommand.DeletePatchesFromCommit(gui.State.Commits, commitIndex, gui.GitCommand.PatchManager)
return gui.handleGenericMergeCommandResult(err)
})
}
func (gui *Gui) handleMovePatchToSelectedCommit() error {
if ok, err := gui.validateNormalWorkingTreeState(); !ok {
return err
}
if err := gui.returnFocusFromLineByLinePanelIfNecessary(); err != nil {
return err
}
return gui.WithWaitingStatus(gui.Tr.SLocalize("RebasingStatus"), func() error {
commitIndex := gui.getPatchCommitIndex()
2019-11-05 02:55:04 +02:00
err := gui.GitCommand.MovePatchToSelectedCommit(gui.State.Commits, commitIndex, gui.State.Panels.Commits.SelectedLine, gui.GitCommand.PatchManager)
return gui.handleGenericMergeCommandResult(err)
})
}
func (gui *Gui) handlePullPatchIntoWorkingTree() error {
if ok, err := gui.validateNormalWorkingTreeState(); !ok {
return err
}
if err := gui.returnFocusFromLineByLinePanelIfNecessary(); err != nil {
return err
}
pull := func(stash bool) error {
return gui.WithWaitingStatus(gui.Tr.SLocalize("RebasingStatus"), func() error {
commitIndex := gui.getPatchCommitIndex()
err := gui.GitCommand.PullPatchIntoIndex(gui.State.Commits, commitIndex, gui.GitCommand.PatchManager, stash)
return gui.handleGenericMergeCommandResult(err)
})
}
if len(gui.trackedFiles()) > 0 {
return gui.createConfirmationPanel(gui.g, gui.g.CurrentView(), true, gui.Tr.SLocalize("MustStashTitle"), gui.Tr.SLocalize("MustStashWarning"), func(*gocui.Gui, *gocui.View) error {
return pull(true)
}, nil)
} else {
return pull(false)
}
}
2020-03-29 23:49:20 +02:00
func (gui *Gui) handleApplyPatch(reverse bool) error {
2020-03-26 12:00:08 +02:00
if err := gui.returnFocusFromLineByLinePanelIfNecessary(); err != nil {
return err
}
2020-03-29 23:49:20 +02:00
if err := gui.GitCommand.PatchManager.ApplyPatches(reverse); err != nil {
2020-03-28 02:47:54 +02:00
return gui.surfaceError(err)
2020-03-26 12:00:08 +02:00
}
return gui.refreshSidePanels(refreshOptions{mode: ASYNC})
2020-03-26 12:00:08 +02:00
}
2019-11-05 09:10:47 +02:00
func (gui *Gui) handleResetPatch() error {
gui.GitCommand.PatchManager.Reset()
return gui.refreshCommitFilesView()
}