From 6db30afc7453202edaea4ef02dc3b1d68ee38ad6 Mon Sep 17 00:00:00 2001 From: Sam Hoang Van Date: Tue, 13 May 2025 10:11:01 +0700 Subject: [PATCH] make apply_diff can deduce when line number in search part fix #2990 (#3329) --- .../__tests__/multi-search-replace.test.ts | 48 +++++++++++++++++++ .../diff/strategies/multi-search-replace.ts | 4 ++ 2 files changed, 52 insertions(+) diff --git a/src/core/diff/strategies/__tests__/multi-search-replace.test.ts b/src/core/diff/strategies/__tests__/multi-search-replace.test.ts index 37edcccb62..dc971d3a10 100644 --- a/src/core/diff/strategies/__tests__/multi-search-replace.test.ts +++ b/src/core/diff/strategies/__tests__/multi-search-replace.test.ts @@ -2332,6 +2332,54 @@ function two() { function three() { return "three"; +}`) + } + }) + + it("should deduce start_line when include line number in search and replace content", async () => { + const originalContent = ` +function one() { + return 1; +} + +function process() { + return "target"; +} + +function process() { + return "target"; +} + +function two() { + return 2; +} +`.trim() + const diffContent = `test.ts +<<<<<<< SEARCH +9 | function process() { +10 | return "target"; +======= +9 | function process2() { +10 | return "target222"; +>>>>>>> REPLACE` + + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe(`function one() { + return 1; +} + +function process() { + return "target"; +} + +function process2() { + return "target222"; +} + +function two() { + return 2; }`) } }) diff --git a/src/core/diff/strategies/multi-search-replace.ts b/src/core/diff/strategies/multi-search-replace.ts index 7c07f06ba0..144b794f75 100644 --- a/src/core/diff/strategies/multi-search-replace.ts +++ b/src/core/diff/strategies/multi-search-replace.ts @@ -380,6 +380,10 @@ Only use a single line of '=======' between search and replacement content, beca (everyLineHasLineNumbers(searchContent) && everyLineHasLineNumbers(replaceContent)) || (everyLineHasLineNumbers(searchContent) && replaceContent.trim() === "") + if (hasAllLineNumbers && startLine === 0) { + startLine = parseInt(searchContent.split("\n")[0].split("|")[0]) + } + if (hasAllLineNumbers) { searchContent = stripLineNumbers(searchContent) replaceContent = stripLineNumbers(replaceContent)