1
0
mirror of https://github.com/jesseduffield/lazygit.git synced 2025-08-06 22:33:07 +02:00

Don't use hunk mode for added or deleted files even when useHunkModeInStagingView config is on (#4758)

- **PR Description**

When entering staging (or patch building) for an added or deleted file,
it doesn't make sense to use hunk mode, because pressing space would
stage/unstage the entire file, and if the user wanted to do that, they
would have pressed space in the Files panel. So always use line mode for
added/deleted files by default, even if the useHunkModeInStagingView
user config is on.
This commit is contained in:
Stefan Haller
2025-07-27 12:23:45 +02:00
committed by GitHub
3 changed files with 91 additions and 1 deletions

View File

@ -186,3 +186,17 @@ func (self *Patch) AdjustLineNumber(lineNumber int) int {
return adjustedLineNumber return adjustedLineNumber
} }
func (self *Patch) IsSingleHunkForWholeFile() bool {
if len(self.hunks) != 1 {
return false
}
// We consider a patch to be a single hunk for the whole file if it has only additions or
// deletions but not both, and no context lines. This not quite correct, because it will also
// return true for a block of added or deleted lines if the diff context size is 0, but in this
// case you wouldn't be able to stage things anyway, so it doesn't matter.
bodyLines := self.hunks[0].bodyLines
return nLinesWithKind(bodyLines, []PatchLineKind{DELETION, CONTEXT}) == 0 ||
nLinesWithKind(bodyLines, []PatchLineKind{ADDITION, CONTEXT}) == 0
}

View File

@ -115,6 +115,17 @@ index 0000000..4e680cc
+grape +grape
` `
const deletedFile = `diff --git a/newfile b/newfile
deleted file mode 100644
index 4e680cc1f..000000000
--- a/newfile
+++ /dev/null
@@ -1,3 +0,0 @@
-apple
-orange
-grape
`
const addNewlineToPreviouslyEmptyFile = `diff --git a/newfile b/newfile const addNewlineToPreviouslyEmptyFile = `diff --git a/newfile b/newfile
index e69de29..c6568ea 100644 index e69de29..c6568ea 100644
--- a/newfile --- a/newfile
@ -554,6 +565,10 @@ func TestParseAndFormatPlain(t *testing.T) {
testName: "newFile", testName: "newFile",
patchStr: newFile, patchStr: newFile,
}, },
{
testName: "deletedFile",
patchStr: deletedFile,
},
{ {
testName: "addNewlineToPreviouslyEmptyFile", testName: "addNewlineToPreviouslyEmptyFile",
patchStr: addNewlineToPreviouslyEmptyFile, patchStr: addNewlineToPreviouslyEmptyFile,
@ -695,3 +710,64 @@ func TestAdjustLineNumber(t *testing.T) {
}) })
} }
} }
func TestIsSingleHunkForWholeFile(t *testing.T) {
scenarios := []struct {
testName string
patchStr string
expectedResult bool
}{
{
testName: "simpleDiff",
patchStr: simpleDiff,
expectedResult: false,
},
{
testName: "addNewlineToEndOfFile",
patchStr: addNewlineToEndOfFile,
expectedResult: false,
},
{
testName: "removeNewlinefromEndOfFile",
patchStr: removeNewlinefromEndOfFile,
expectedResult: false,
},
{
testName: "twoHunks",
patchStr: twoHunks,
expectedResult: false,
},
{
testName: "twoChangesInOneHunk",
patchStr: twoChangesInOneHunk,
expectedResult: false,
},
{
testName: "newFile",
patchStr: newFile,
expectedResult: true,
},
{
testName: "deletedFile",
patchStr: deletedFile,
expectedResult: true,
},
{
testName: "addNewlineToPreviouslyEmptyFile",
patchStr: addNewlineToPreviouslyEmptyFile,
expectedResult: true,
},
{
testName: "exampleHunk",
patchStr: exampleHunk,
expectedResult: false,
},
}
for _, s := range scenarios {
t.Run(s.testName, func(t *testing.T) {
patch := Parse(s.patchStr)
assert.Equal(t, s.expectedResult, patch.IsSingleHunkForWholeFile())
})
}
}

View File

@ -67,7 +67,7 @@ func NewState(diff string, selectedLineIdx int, view *gocui.View, oldState *Stat
} }
selectMode := LINE selectMode := LINE
if useHunkModeByDefault { if useHunkModeByDefault && !patch.IsSingleHunkForWholeFile() {
selectMode = HUNK selectMode = HUNK
} }