Skip to content

Commit 4af2786

Browse files
committed
fix: Improve handling of escaped markers in apply_diff
unescapeMarkers() is supposed to fix escaped merge conflict markers so that they match the code. However the function has a bug which requires SEARCH and REPLACE strings in the markers to be replaced. This is not part of merge conflict markers, so many valid cases were previously missed.
1 parent a3e6c91 commit 4af2786

File tree

2 files changed

+47
-47
lines changed

2 files changed

+47
-47
lines changed

src/core/diff/strategies/__tests__/multi-search-replace.test.ts

Lines changed: 45 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -816,7 +816,7 @@ function five() {
816816
const diff =
817817
"<<<<<<< SEARCH\n" +
818818
"before\n" +
819-
"\\<<<<<<< SEARCH\n" +
819+
"\\<<<<<<<\n" +
820820
"after\n" +
821821
"=======\n" +
822822
"new content\n" +
@@ -839,11 +839,11 @@ function five() {
839839
})
840840

841841
it("processes escaped search marker in content", async () => {
842-
const originalContent = "before\n<<<<<<< SEARCH\nafter\n"
842+
const originalContent = "before\n<<<<<<<\nafter\n"
843843
const diffContent =
844844
"<<<<<<< SEARCH\n" +
845845
"before\n" +
846-
"\\<<<<<<< SEARCH\n" +
846+
"\\<<<<<<<\n" +
847847
"after\n" +
848848
"=======\n" +
849849
"unchanged\n" +
@@ -873,11 +873,11 @@ function five() {
873873
})
874874

875875
it("processes escaped search marker in content", async () => {
876-
const originalContent = "before\n<<<<<<< SEARCH\nafter\n"
876+
const originalContent = "before\n<<<<<<<\nafter\n"
877877
const diffContent =
878878
"<<<<<<< SEARCH\n" +
879879
"before\n" +
880-
"\\<<<<<<< SEARCH\n" +
880+
"\\<<<<<<<\n" +
881881
"after\n" +
882882
"=======\n" +
883883
"unchanged\n" +
@@ -907,12 +907,12 @@ function five() {
907907
})
908908

909909
it("processes escaped search marker in content", async () => {
910-
const originalContent = "before\n<<<<<<< SEARCH\nafter\n"
910+
const originalContent = "before\n<<<<<<<\nafter\n"
911911
const diffContent =
912912
"test.ts\n" +
913913
"<<<<<<< SEARCH\n" +
914914
"before\n" +
915-
"\\<<<<<<< SEARCH\n" +
915+
"\\<<<<<<<\n" +
916916
"after\n" +
917917
"=======\n" +
918918
"unchanged\n" +
@@ -925,12 +925,12 @@ function five() {
925925
})
926926

927927
it("processes escaped search marker in content", async () => {
928-
const originalContent = "before\n<<<<<<< SEARCH\nafter\n"
928+
const originalContent = "before\n<<<<<<<\nafter\n"
929929
const diffContent =
930930
"test.ts\n" +
931931
"<<<<<<< SEARCH\n" +
932932
"before\n" +
933-
"\\<<<<<<< SEARCH\n" +
933+
"\\<<<<<<<\n" +
934934
"after\n" +
935935
"=======\n" +
936936
"unchanged\n" +
@@ -960,11 +960,11 @@ function five() {
960960
})
961961

962962
it("processes escaped search marker in content", async () => {
963-
const originalContent = "before\n<<<<<<< SEARCH\nafter\n"
963+
const originalContent = "before\n<<<<<<<\nafter\n"
964964
const diffContent =
965965
"<<<<<<< SEARCH\n" +
966966
"before\n" +
967-
"\\<<<<<<< SEARCH\n" +
967+
"\\<<<<<<<\n" +
968968
"after\n" +
969969
"=======\n" +
970970
"unchanged\n" +
@@ -977,11 +977,11 @@ function five() {
977977
})
978978

979979
it("processes escaped search marker in content", async () => {
980-
const originalContent = "before\n<<<<<<< SEARCH\nafter\n"
980+
const originalContent = "before\n<<<<<<<\nafter\n"
981981
const diffContent =
982982
"<<<<<<< SEARCH\n" +
983983
"before\n" +
984-
"\\<<<<<<< SEARCH\n" +
984+
"\\<<<<<<<\n" +
985985
"after\n" +
986986
"=======\n" +
987987
"unchanged\n" +
@@ -994,11 +994,11 @@ function five() {
994994
})
995995

996996
it("processes escaped search marker in content", async () => {
997-
const originalContent = "before\n<<<<<<< SEARCH\nafter\n"
997+
const originalContent = "before\n<<<<<<<\nafter\n"
998998
const diffContent =
999999
"<<<<<<< SEARCH\n" +
10001000
"before\n" +
1001-
"\\<<<<<<< SEARCH\n" +
1001+
"\\<<<<<<<\n" +
10021002
"after\n" +
10031003
"=======\n" +
10041004
"unchanged\n" +
@@ -1031,7 +1031,7 @@ function five() {
10311031
const diff =
10321032
"<<<<<<< SEARCH\n" +
10331033
"before\n" +
1034-
"\\<<<<<<< SEARCH\n" +
1034+
"\\<<<<<<<\n" +
10351035
"after\n" +
10361036
"=======\n" +
10371037
"new content\n" +
@@ -1055,7 +1055,7 @@ function five() {
10551055
const diff =
10561056
"<<<<<<< SEARCH\n" +
10571057
"before\n" +
1058-
"\\<<<<<<< SEARCH\n" +
1058+
"\\<<<<<<<\n" +
10591059
"after\n" +
10601060
"=======\n" +
10611061
"new content\n" +
@@ -1067,7 +1067,7 @@ function five() {
10671067
const diff =
10681068
"<<<<<<< SEARCH\n" +
10691069
"before\n" +
1070-
"\\<<<<<<< SEARCH\n" +
1070+
"\\<<<<<<<\n" +
10711071
"after\n" +
10721072
"=======\n" +
10731073
"new content\n" +
@@ -1091,7 +1091,7 @@ function five() {
10911091
const diff =
10921092
"<<<<<<< SEARCH\n" +
10931093
"before\n" +
1094-
"\\>>>>>>> REPLACE\n" +
1094+
"\\>>>>>>>\n" +
10951095
"after\n" +
10961096
"=======\n" +
10971097
"new content\n" +
@@ -1115,7 +1115,7 @@ function five() {
11151115
const diff =
11161116
"<<<<<<< SEARCH\n" +
11171117
"before\n" +
1118-
"\\>>>>>>> REPLACE\n" +
1118+
"\\>>>>>>>\n" +
11191119
"after\n" +
11201120
"=======\n" +
11211121
"new content\n" +
@@ -1127,7 +1127,7 @@ function five() {
11271127
const diff =
11281128
"<<<<<<< SEARCH\n" +
11291129
"before\n" +
1130-
"\\>>>>>>> REPLACE\n" +
1130+
"\\>>>>>>>\n" +
11311131
"after\n" +
11321132
"=======\n" +
11331133
"new content\n" +
@@ -1136,11 +1136,11 @@ function five() {
11361136
})
11371137

11381138
it("processes escaped search marker in content", async () => {
1139-
const originalContent = "before\n<<<<<<< SEARCH\nafter\n"
1139+
const originalContent = "before\n<<<<<<<\nafter\n"
11401140
const diffContent =
11411141
"<<<<<<< SEARCH\n" +
11421142
"before\n" +
1143-
"\\<<<<<<< SEARCH\n" +
1143+
"\\<<<<<<<\n" +
11441144
"after\n" +
11451145
"=======\n" +
11461146
"replaced content\n" +
@@ -1153,11 +1153,11 @@ function five() {
11531153
})
11541154

11551155
it("processes escaped replace marker in content", async () => {
1156-
const originalContent = "before\n>>>>>>> REPLACE\nafter\n"
1156+
const originalContent = "before\n>>>>>>>\nafter\n"
11571157
const diffContent =
11581158
"<<<<<<< SEARCH\n" +
11591159
"before\n" +
1160-
"\\>>>>>>> REPLACE\n" +
1160+
"\\>>>>>>>\n" +
11611161
"after\n" +
11621162
"=======\n" +
11631163
"unchanged\n" +
@@ -1170,12 +1170,12 @@ function five() {
11701170
})
11711171

11721172
it("processes multiple escaped markers in content", async () => {
1173-
const originalContent = "<<<<<<< SEARCH\n=======\n>>>>>>> REPLACE\n"
1173+
const originalContent = "<<<<<<<\n=======\n>>>>>>>\n"
11741174
const diffContent =
11751175
"<<<<<<< SEARCH\n" +
1176-
"\\<<<<<<< SEARCH\n" +
1176+
"\\<<<<<<<\n" +
11771177
"\\=======\n" +
1178-
"\\>>>>>>> REPLACE\n" +
1178+
"\\>>>>>>>\n" +
11791179
"=======\n" +
11801180
"unchanged\n" +
11811181
">>>>>>> REPLACE"
@@ -1204,11 +1204,11 @@ function five() {
12041204
})
12051205

12061206
it("processes escaped search marker in content", async () => {
1207-
const originalContent = "before\n<<<<<<< SEARCH\nafter\n"
1207+
const originalContent = "before\n<<<<<<<\nafter\n"
12081208
const diffContent =
12091209
"<<<<<<< SEARCH\n" +
12101210
"before\n" +
1211-
"\\<<<<<<< SEARCH\n" +
1211+
"\\<<<<<<<\n" +
12121212
"after\n" +
12131213
"=======\n" +
12141214
"unchanged\n" +
@@ -1221,11 +1221,11 @@ function five() {
12211221
})
12221222

12231223
it("processes escaped replace marker in content", async () => {
1224-
const originalContent = "before\n>>>>>>> REPLACE\nafter\n"
1224+
const originalContent = "before\n>>>>>>>\nafter\n"
12251225
const diffContent =
12261226
"<<<<<<< SEARCH\n" +
12271227
"before\n" +
1228-
"\\>>>>>>> REPLACE\n" +
1228+
"\\>>>>>>>\n" +
12291229
"after\n" +
12301230
"=======\n" +
12311231
"unchanged\n" +
@@ -1256,11 +1256,11 @@ function five() {
12561256
})
12571257

12581258
it("processes escaped replace marker in content", async () => {
1259-
const originalContent = "before\n>>>>>>> REPLACE\nafter\n"
1259+
const originalContent = "before\n>>>>>>>\nafter\n"
12601260
const diffContent =
12611261
"<<<<<<< SEARCH\n" +
12621262
"before\n" +
1263-
"\\>>>>>>> REPLACE\n" +
1263+
"\\>>>>>>>\n" +
12641264
"after\n" +
12651265
"=======\n" +
12661266
"unchanged\n" +
@@ -1273,12 +1273,12 @@ function five() {
12731273
})
12741274

12751275
it("processes multiple escaped markers in content", async () => {
1276-
const originalContent = "<<<<<<< SEARCH\n=======\n>>>>>>> REPLACE\n"
1276+
const originalContent = "<<<<<<<\n=======\n>>>>>>>\n"
12771277
const diffContent =
12781278
"<<<<<<< SEARCH\n" +
1279-
"\\<<<<<<< SEARCH\n" +
1279+
"\\<<<<<<<\n" +
12801280
"\\=======\n" +
1281-
"\\>>>>>>> REPLACE\n" +
1281+
"\\>>>>>>>\n" +
12821282
"=======\n" +
12831283
"unchanged\n" +
12841284
">>>>>>> REPLACE"
@@ -1290,11 +1290,11 @@ function five() {
12901290
})
12911291

12921292
it("processes escaped replace marker in content", async () => {
1293-
const originalContent = "before\n>>>>>>> REPLACE\nafter\n"
1293+
const originalContent = "before\n>>>>>>>\nafter\n"
12941294
const diffContent =
12951295
"<<<<<<< SEARCH\n" +
12961296
"before\n" +
1297-
"\\>>>>>>> REPLACE\n" +
1297+
"\\>>>>>>>\n" +
12981298
"after\n" +
12991299
"=======\n" +
13001300
"unchanged\n" +
@@ -1307,12 +1307,12 @@ function five() {
13071307
})
13081308

13091309
it("processes multiple escaped markers in content", async () => {
1310-
const originalContent = "<<<<<<< SEARCH\n=======\n>>>>>>> REPLACE\n"
1310+
const originalContent = "<<<<<<<\n=======\n>>>>>>>\n"
13111311
const diffContent =
13121312
"<<<<<<< SEARCH\n" +
1313-
"\\<<<<<<< SEARCH\n" +
1313+
"\\<<<<<<<\n" +
13141314
"\\=======\n" +
1315-
"\\>>>>>>> REPLACE\n" +
1315+
"\\>>>>>>>\n" +
13161316
"=======\n" +
13171317
"unchanged\n" +
13181318
">>>>>>> REPLACE"
@@ -1327,7 +1327,7 @@ function five() {
13271327
const diff =
13281328
"<<<<<<< SEARCH\n" +
13291329
"before\n" +
1330-
"\\>>>>>>> REPLACE\n" +
1330+
"\\>>>>>>>\n" +
13311331
"after\n" +
13321332
"=======\n" +
13331333
"new content\n" +
@@ -1339,9 +1339,9 @@ function five() {
13391339
it("allows multiple escaped markers in content", () => {
13401340
const diff =
13411341
"<<<<<<< SEARCH\n" +
1342-
"\\<<<<<<< SEARCH\n" +
1342+
"\\<<<<<<<\n" +
13431343
"\\=======\n" +
1344-
"\\>>>>>>> REPLACE\n" +
1344+
"\\>>>>>>>\n" +
13451345
"=======\n" +
13461346
"new content\n" +
13471347
">>>>>>> REPLACE"

src/core/diff/strategies/multi-search-replace.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,9 +143,9 @@ Only use a single line of '=======' between search and replacement content, beca
143143

144144
private unescapeMarkers(content: string): string {
145145
return content
146-
.replace(/^\\<<<<<<< SEARCH/gm, "<<<<<<< SEARCH")
146+
.replace(/^\\<<<<<<</gm, "<<<<<<<")
147147
.replace(/^\\=======/gm, "=======")
148-
.replace(/^\\>>>>>>> REPLACE/gm, ">>>>>>> REPLACE")
148+
.replace(/^\\>>>>>>>/gm, ">>>>>>>")
149149
.replace(/^\\-------/gm, "-------")
150150
.replace(/^\\:end_line:/gm, ":end_line:")
151151
.replace(/^\\:start_line:/gm, ":start_line:")

0 commit comments

Comments
 (0)