mirror of
https://github.com/jesseduffield/lazygit.git
synced 2024-12-12 11:15:00 +02:00
64782a433e
The state object is sometimes undefined in the onclick method of the line by line panel. Because we set it to nil in a bunch of places, I've decided to just change the main context to 'normal' before setting it to nil anywhere. That way the keybindings for the line by line panel won't get executed and we won't get a segfault.
116 lines
2.9 KiB
Go
116 lines
2.9 KiB
Go
package gui
|
|
|
|
import (
|
|
"github.com/jesseduffield/gocui"
|
|
)
|
|
|
|
func (gui *Gui) refreshPatchBuildingPanel(selectedLineIdx int) error {
|
|
if !gui.GitCommand.PatchManager.CommitSelected() {
|
|
return gui.handleEscapePatchBuildingPanel(gui.g, nil)
|
|
}
|
|
|
|
gui.State.SplitMainPanel = true
|
|
|
|
gui.getMainView().Title = "Patch"
|
|
gui.getSecondaryView().Title = "Custom Patch"
|
|
|
|
// get diff from commit file that's currently selected
|
|
commitFile := gui.getSelectedCommitFile(gui.g)
|
|
if commitFile == nil {
|
|
return gui.renderString(gui.g, "commitFiles", gui.Tr.SLocalize("NoCommiteFiles"))
|
|
}
|
|
|
|
diff, err := gui.GitCommand.ShowCommitFile(commitFile.Sha, commitFile.Name, true)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
secondaryDiff := gui.GitCommand.PatchManager.RenderPatchForFile(commitFile.Name, true, false, true)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
empty, err := gui.refreshLineByLinePanel(diff, secondaryDiff, false, selectedLineIdx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if empty {
|
|
return gui.handleEscapePatchBuildingPanel(gui.g, nil)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (gui *Gui) handleAddSelectionToPatch(g *gocui.Gui, v *gocui.View) error {
|
|
state := gui.State.Panels.LineByLine
|
|
|
|
// add range of lines to those set for the file
|
|
commitFile := gui.getSelectedCommitFile(gui.g)
|
|
if commitFile == nil {
|
|
return gui.renderString(gui.g, "commitFiles", gui.Tr.SLocalize("NoCommiteFiles"))
|
|
}
|
|
|
|
gui.GitCommand.PatchManager.AddFileLineRange(commitFile.Name, state.FirstLineIdx, state.LastLineIdx)
|
|
|
|
if err := gui.refreshCommitFilesView(); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := gui.refreshPatchBuildingPanel(-1); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (gui *Gui) handleRemoveSelectionFromPatch(g *gocui.Gui, v *gocui.View) error {
|
|
state := gui.State.Panels.LineByLine
|
|
|
|
// add range of lines to those set for the file
|
|
commitFile := gui.getSelectedCommitFile(gui.g)
|
|
if commitFile == nil {
|
|
return gui.renderString(gui.g, "commitFiles", gui.Tr.SLocalize("NoCommiteFiles"))
|
|
}
|
|
|
|
gui.GitCommand.PatchManager.RemoveFileLineRange(commitFile.Name, state.FirstLineIdx, state.LastLineIdx)
|
|
|
|
if err := gui.refreshCommitFilesView(); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := gui.refreshPatchBuildingPanel(-1); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (gui *Gui) handleEscapePatchBuildingPanel(g *gocui.Gui, v *gocui.View) error {
|
|
gui.handleEscapeLineByLinePanel()
|
|
|
|
if gui.GitCommand.PatchManager.IsEmpty() {
|
|
gui.GitCommand.PatchManager.Reset()
|
|
gui.State.SplitMainPanel = false
|
|
}
|
|
|
|
return gui.switchFocus(gui.g, nil, gui.getCommitFilesView())
|
|
}
|
|
|
|
func (gui *Gui) refreshSecondaryPatchPanel() error {
|
|
if gui.GitCommand.PatchManager.CommitSelected() {
|
|
gui.State.SplitMainPanel = true
|
|
secondaryView := gui.getSecondaryView()
|
|
secondaryView.Highlight = true
|
|
secondaryView.Wrap = false
|
|
|
|
gui.g.Update(func(*gocui.Gui) error {
|
|
return gui.setViewContent(gui.g, gui.getSecondaryView(), gui.GitCommand.PatchManager.RenderAggregatedPatchColored(false))
|
|
})
|
|
} else {
|
|
gui.State.SplitMainPanel = false
|
|
}
|
|
|
|
return nil
|
|
}
|