2019-11-05 14:21:19 +11:00
package gui
import (
2020-02-29 18:44:08 +11:00
"github.com/jesseduffield/lazygit/pkg/utils"
2019-11-05 14:21:19 +11:00
)
2020-08-22 18:29:09 +10:00
// getFromAndReverseArgsForDiff tells us the from and reverse args to be used in a diff command. If we're not in diff mode we'll end up with the equivalent of a `git show` i.e `git diff blah^..blah`.
func ( gui * Gui ) getFromAndReverseArgsForDiff ( to string ) ( string , bool ) {
from := to + "^"
reverse := false
if gui . State . Modes . Diffing . Active ( ) {
reverse = gui . State . Modes . Diffing . Reverse
from = gui . State . Modes . Diffing . Ref
}
return from , reverse
}
2021-04-18 16:30:34 +10:00
func ( gui * Gui ) refreshPatchBuildingPanel ( selectedLineIdx int , state * LblPanelState ) error {
2020-08-21 20:31:21 +10:00
if ! gui . GitCommand . PatchManager . Active ( ) {
2020-08-15 17:23:16 +10:00
return gui . handleEscapePatchBuildingPanel ( )
2019-11-05 17:57:59 +11:00
}
2021-04-04 23:51:59 +10:00
gui . Views . Main . Title = "Patch"
gui . Views . Secondary . Title = "Custom Patch"
2019-11-10 16:20:35 +11:00
2019-11-05 14:21:19 +11:00
// get diff from commit file that's currently selected
2021-03-31 22:08:55 +11:00
node := gui . getSelectedCommitFileNode ( )
if node == nil {
2020-03-09 11:34:10 +11:00
return nil
2019-11-05 14:21:19 +11:00
}
2021-03-31 23:26:53 +11:00
to := gui . State . CommitFileManager . GetParent ( )
2020-08-22 18:29:09 +10:00
from , reverse := gui . getFromAndReverseArgsForDiff ( to )
2021-03-31 22:08:55 +11:00
diff , err := gui . GitCommand . ShowFileDiff ( from , to , reverse , node . GetPath ( ) , true )
2019-11-05 14:21:19 +11:00
if err != nil {
return err
}
2021-03-31 22:08:55 +11:00
secondaryDiff := gui . GitCommand . PatchManager . RenderPatchForFile ( node . GetPath ( ) , true , false , true )
2019-11-05 14:21:19 +11:00
if err != nil {
return err
}
2021-04-18 16:30:34 +10:00
empty , err := gui . refreshLineByLinePanel ( diff , secondaryDiff , false , selectedLineIdx )
2019-11-05 14:21:19 +11:00
if err != nil {
return err
}
if empty {
2020-08-15 17:23:16 +10:00
return gui . handleEscapePatchBuildingPanel ( )
2019-11-05 14:21:19 +11:00
}
return nil
}
2020-10-08 08:01:04 +11:00
func ( gui * Gui ) handleRefreshPatchBuildingPanel ( selectedLineIdx int ) error {
gui . Mutexes . LineByLinePanelMutex . Lock ( )
defer gui . Mutexes . LineByLinePanelMutex . Unlock ( )
return gui . refreshPatchBuildingPanel ( selectedLineIdx , gui . State . Panels . LineByLine )
}
2020-10-07 17:54:45 +11:00
func ( gui * Gui ) handleToggleSelectionForPatch ( ) error {
2021-04-18 16:30:34 +10:00
err := gui . withLBLActiveCheck ( func ( state * LblPanelState ) error {
2020-10-07 17:54:45 +11:00
toggleFunc := gui . GitCommand . PatchManager . AddFileLineRange
filename := gui . getSelectedCommitFileName ( )
includedLineIndices , err := gui . GitCommand . PatchManager . GetFileIncLineIndices ( filename )
if err != nil {
return err
}
2021-04-18 16:30:34 +10:00
currentLineIsStaged := utils . IncludesInt ( includedLineIndices , state . GetSelectedLineIdx ( ) )
2020-10-07 17:54:45 +11:00
if currentLineIsStaged {
toggleFunc = gui . GitCommand . PatchManager . RemoveFileLineRange
}
2019-11-05 14:21:19 +11:00
2020-10-07 17:54:45 +11:00
// add range of lines to those set for the file
2021-03-31 22:08:55 +11:00
node := gui . getSelectedCommitFileNode ( )
if node == nil {
2020-10-07 17:54:45 +11:00
return nil
}
2019-11-05 14:21:19 +11:00
2021-04-18 16:30:34 +10:00
firstLineIdx , lastLineIdx := state . SelectedRange ( )
if err := toggleFunc ( node . GetPath ( ) , firstLineIdx , lastLineIdx ) ; err != nil {
2020-10-07 17:54:45 +11:00
// might actually want to return an error here
gui . Log . Error ( err )
}
2019-11-05 14:21:19 +11:00
2020-10-07 17:54:45 +11:00
return nil
} )
2020-10-08 08:01:04 +11:00
if err != nil {
return err
}
if err := gui . refreshCommitFilesView ( ) ; err != nil {
return err
}
return nil
2019-11-05 14:21:19 +11:00
}
2020-08-15 17:23:16 +10:00
func ( gui * Gui ) handleEscapePatchBuildingPanel ( ) error {
2020-10-02 07:56:14 +10:00
gui . escapeLineByLinePanel ( )
2019-11-05 14:21:19 +11:00
2019-11-10 15:24:20 +11:00
if gui . GitCommand . PatchManager . IsEmpty ( ) {
gui . GitCommand . PatchManager . Reset ( )
}
2021-04-03 15:56:11 +11:00
if gui . currentContext ( ) . GetKey ( ) == gui . State . Contexts . PatchBuilding . GetKey ( ) {
return gui . pushContext ( gui . State . Contexts . CommitFiles )
2020-08-23 13:49:05 +10:00
} else {
// need to re-focus in case the secondary view should now be hidden
return gui . currentContext ( ) . HandleFocus ( )
2020-08-21 21:08:06 +10:00
}
2019-11-05 14:21:19 +11:00
}
2019-11-05 15:11:35 +11:00
2020-08-18 22:02:35 +10:00
func ( gui * Gui ) secondaryPatchPanelUpdateOpts ( ) * viewUpdateOpts {
2020-08-21 20:31:21 +10:00
if gui . GitCommand . PatchManager . Active ( ) {
2020-08-18 22:02:35 +10:00
patch := gui . GitCommand . PatchManager . RenderAggregatedPatchColored ( false )
return & viewUpdateOpts {
title : "Custom Patch" ,
noWrap : true ,
highlight : true ,
2021-04-04 23:51:59 +10:00
task : NewRenderStringWithoutScrollTask ( patch ) ,
2020-08-18 22:02:35 +10:00
}
}
return nil
}