fix(diff): reveal a fully deleted file's hunk from an original-side search

pierreSearchRevealLine returned 0 for a fully deleted file, because it maps a deletion onto a
neighbouring new-file line and a fully deleted file has no addition lines. FileDiff.revealLine
works in 1-based new-file coordinates -- getHunkAdditionLineRange adds 1 to the side boundary, so
a +0,0 hunk is the range [1, 1), not 0. Searching Original for text in a fully deleted file
therefore never expanded that hunk in a combined diff, and selection restore hit the same path.
This commit is contained in:
Neil
2026-09-11 23:35:47 -07:00
parent 03ee31195e
commit ea99f60ff8
2 changed files with 16 additions and 2 deletions
@@ -33,3 +33,17 @@ it('does not feed a pure-deletion line number to revealLine', () => {
expect(revealed).toBeGreaterThanOrEqual(hunk.additionStart)
expect(revealed).toBeLessThanOrEqual(additionEnd)
})
it('maps a fully deleted file onto the empty new-file hunk start', () => {
const diff = buildPierreFileDiff({
...input,
status: 'deleted',
originalContent: `${'keep\n'.repeat(40)}${'drop\n'.repeat(10)}GONE\n${'keep\n'.repeat(40)}old\n`,
modifiedContent: ''
})
expect(diff.additionLines).toHaveLength(0)
expect(diff.hunks[0]?.additionStart).toBe(0)
expect(diff.hunks[0]?.additionCount).toBe(0)
// FileDiff.revealLine uses 1-based new-file ranges; +0,0 becomes [1, 1).
expect(pierreSearchRevealLine(diff, 51, 'deletions')).toBe(1)
})
@@ -146,8 +146,8 @@ export function pierreSearchRevealLine(
if (side === 'additions') {
return lineNumber
}
// revealLine is new-file only; never pass a pure-deletion old-file number.
let modifiedLine = 0
// revealLine is new-file only; +0,0 (fully deleted) is range [1, 1), not 0.
let modifiedLine = 1
let found = false
iterateOverDiff({
diff,