From ea99f60ff83848fb9c5bcacba6754cb03da67464 Mon Sep 17 00:00:00 2001 From: Neil Date: Fri, 11 Sep 2026 23:35:47 -0700 Subject: [PATCH] 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. --- .../pierre-diff/pierre-diff-search-view.test.ts | 14 ++++++++++++++ .../editor/pierre-diff/pierre-diff-search-view.ts | 4 ++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/renderer/src/components/editor/pierre-diff/pierre-diff-search-view.test.ts b/src/renderer/src/components/editor/pierre-diff/pierre-diff-search-view.test.ts index b08c7bfbc3f..619d5af3c70 100644 --- a/src/renderer/src/components/editor/pierre-diff/pierre-diff-search-view.test.ts +++ b/src/renderer/src/components/editor/pierre-diff/pierre-diff-search-view.test.ts @@ -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) +}) diff --git a/src/renderer/src/components/editor/pierre-diff/pierre-diff-search-view.ts b/src/renderer/src/components/editor/pierre-diff/pierre-diff-search-view.ts index 25379425227..a6d56fd33aa 100644 --- a/src/renderer/src/components/editor/pierre-diff/pierre-diff-search-view.ts +++ b/src/renderer/src/components/editor/pierre-diff/pierre-diff-search-view.ts @@ -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,