- commit
- 13fb1e81ed10a826560fe7fe46821651e22cf318
- parent
- fd81e691916458ec287958a3227df93b80ef945c
- Author
- OpenCode <opencode@example.com>
- Date
- 2026-10-31 22:59
fix bound diff merges
Diffstat
| M | static/diff.js | 10 | ++++++---- |
| M | static/test.js | 1 | + |
2 files changed, 7 insertions, 4 deletions
diff --git a/static/diff.js b/static/diff.js
@@ -65,15 +65,17 @@ export var diff = function(text1, text2, ctx) {
65 65
66 66 export var merge = function([start1, end1, before1, after1], [start2, end2, before2, after2]) {
67 67 if (start1 + after1.length + end1 === start2 + before2.length + end2) {
-1 68 var d = start2 - start1;
-1 69
68 70 // merge subsequent inserts
69 -1 if (start2 >= start1 && after1.slice(start2 - start1).startsWith(before2)) {
70 -1 var after = _apply(after1, [start2 - start1, before2, after2]);
-1 71 if (d >= 0 && d <= after1.length && after1.slice(d).startsWith(before2)) {
-1 72 var after = _apply(after1, [d, before2, after2]);
71 73 return [[start1, end1, before1, after]];
72 74 }
73 75
74 76 // merge subsequent deletes (inverse insert)
75 -1 if (start1 >= start2 && before2.slice(start1 - start2).startsWith(after1)) {
76 -1 var before = _apply(before2, [start1 - start2, after1, before1]);
-1 77 if (-d >= 0 && -d <= before2.length && before2.slice(-d).startsWith(after1)) {
-1 78 var before = _apply(before2, [-d, after1, before1]);
77 79 return [[start2, end2, before, after2]];
78 80 }
79 81 }
diff --git a/static/test.js b/static/test.js
@@ -25,3 +25,4 @@ assertEqual(diff.diff('xxasdz', 'xxasz', 3), [1, 0, 'xasdz', 'xasz'], 'diff dele
25 25
26 26 assertEqual(diff.merge([1, 0, 'foobaz', 'foobbaz'], [2, 1, 'oobba', 'oobaba']), [[1, 0, 'foobaz', 'foobabaz']], 'merge insert');
27 27 assertEqual(diff.merge([1, 1, 'fooba', 'foba'], [0, 0, 'Xfobaz', 'Xfbaz']), [[0, 0, 'Xfoobaz', 'Xfbaz']], 'merge delete');
-1 28 assertEqual(diff.merge([0, 2, 'a', 'b'], [2, 0, 'a', 'b']), [[0, 2, 'a', 'b'], [2, 0, 'a', 'b']], 'do not merge separate changes');