2019-11-05 05:21:19 +02:00
package gui
import (
2020-02-29 09:44:08 +02:00
"github.com/jesseduffield/lazygit/pkg/utils"
2019-11-05 05:21:19 +02:00
)
2020-08-22 10:29:09 +02: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 08:30:34 +02:00
func ( gui * Gui ) refreshPatchBuildingPanel ( selectedLineIdx int , state * LblPanelState ) error {
2020-08-21 12:31:21 +02:00
if ! gui . GitCommand . PatchManager . Active ( ) {
2020-08-15 09:23:16 +02:00
return gui . handleEscapePatchBuildingPanel ( )
2019-11-05 08:57:59 +02:00
}
2021-04-04 15:51:59 +02:00
gui . Views . Main . Title = "Patch"
gui . Views . Secondary . Title = "Custom Patch"
2019-11-10 07:20:35 +02:00
2019-11-05 05:21:19 +02:00
// get diff from commit file that's currently selected
2021-03-31 13:08:55 +02:00
node := gui . getSelectedCommitFileNode ( )
if node == nil {
2020-03-09 02:34:10 +02:00
return nil
2019-11-05 05:21:19 +02:00
}
2021-03-31 14:26:53 +02:00
to := gui . State . CommitFileManager . GetParent ( )
2020-08-22 10:29:09 +02:00
from , reverse := gui . getFromAndReverseArgsForDiff ( to )
2021-03-31 13:08:55 +02:00
diff , err := gui . GitCommand . ShowFileDiff ( from , to , reverse , node . GetPath ( ) , true )
2019-11-05 05:21:19 +02:00
if err != nil {
return err
}
2021-03-31 13:08:55 +02:00
secondaryDiff := gui . GitCommand . PatchManager . RenderPatchForFile ( node . GetPath ( ) , true , false , true )
2019-11-05 05:21:19 +02:00
if err != nil {
return err
}
2021-04-18 08:30:34 +02:00
empty , err := gui . refreshLineByLinePanel ( diff , secondaryDiff , false , selectedLineIdx )
2019-11-05 05:21:19 +02:00
if err != nil {
return err
}
if empty {
2020-08-15 09:23:16 +02:00
return gui . handleEscapePatchBuildingPanel ( )
2019-11-05 05:21:19 +02:00
}
return nil
}
2020-10-07 23:01:04 +02: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 08:54:45 +02:00
func ( gui * Gui ) handleToggleSelectionForPatch ( ) error {
2021-04-18 08:30:34 +02:00
err := gui . withLBLActiveCheck ( func ( state * LblPanelState ) error {
2020-10-07 08:54:45 +02:00
toggleFunc := gui . GitCommand . PatchManager . AddFileLineRange
filename := gui . getSelectedCommitFileName ( )
includedLineIndices , err := gui . GitCommand . PatchManager . GetFileIncLineIndices ( filename )
if err != nil {
return err
}
2021-04-18 08:30:34 +02:00
currentLineIsStaged := utils . IncludesInt ( includedLineIndices , state . GetSelectedLineIdx ( ) )
2020-10-07 08:54:45 +02:00
if currentLineIsStaged {
toggleFunc = gui . GitCommand . PatchManager . RemoveFileLineRange
}
2019-11-05 05:21:19 +02:00
2020-10-07 08:54:45 +02:00
// add range of lines to those set for the file
2021-03-31 13:08:55 +02:00
node := gui . getSelectedCommitFileNode ( )
if node == nil {
2020-10-07 08:54:45 +02:00
return nil
}
2019-11-05 05:21:19 +02:00
2021-04-18 08:30:34 +02:00
firstLineIdx , lastLineIdx := state . SelectedRange ( )
if err := toggleFunc ( node . GetPath ( ) , firstLineIdx , lastLineIdx ) ; err != nil {
2020-10-07 08:54:45 +02:00
// might actually want to return an error here
gui . Log . Error ( err )
}
2019-11-05 05:21:19 +02:00
2020-10-07 08:54:45 +02:00
return nil
} )
2020-10-07 23:01:04 +02:00
if err != nil {
return err
}
if err := gui . refreshCommitFilesView ( ) ; err != nil {
return err
}
return nil
2019-11-05 05:21:19 +02:00
}
2020-08-15 09:23:16 +02:00
func ( gui * Gui ) handleEscapePatchBuildingPanel ( ) error {
2020-10-01 23:56:14 +02:00
gui . escapeLineByLinePanel ( )
2019-11-05 05:21:19 +02:00
2019-11-10 06:24:20 +02:00
if gui . GitCommand . PatchManager . IsEmpty ( ) {
gui . GitCommand . PatchManager . Reset ( )
}
2021-04-03 06:56:11 +02:00
if gui . currentContext ( ) . GetKey ( ) == gui . State . Contexts . PatchBuilding . GetKey ( ) {
return gui . pushContext ( gui . State . Contexts . CommitFiles )
2020-08-23 05:49:05 +02:00
} else {
// need to re-focus in case the secondary view should now be hidden
return gui . currentContext ( ) . HandleFocus ( )
2020-08-21 13:08:06 +02:00
}
2019-11-05 05:21:19 +02:00
}
2019-11-05 06:11:35 +02:00
2020-08-18 14:02:35 +02:00
func ( gui * Gui ) secondaryPatchPanelUpdateOpts ( ) * viewUpdateOpts {
2020-08-21 12:31:21 +02:00
if gui . GitCommand . PatchManager . Active ( ) {
2020-08-18 14:02:35 +02:00
patch := gui . GitCommand . PatchManager . RenderAggregatedPatchColored ( false )
return & viewUpdateOpts {
title : "Custom Patch" ,
noWrap : true ,
highlight : true ,
2021-04-04 15:51:59 +02:00
task : NewRenderStringWithoutScrollTask ( patch ) ,
2020-08-18 14:02:35 +02:00
}
}
return nil
}