Skip to content

Commit 7f6fb7b

Browse files
committed
Consider correctly both text limits instead of fail when reaching one
1 parent 2ddde3f commit 7f6fb7b

File tree

1 file changed

+27
-12
lines changed

1 file changed

+27
-12
lines changed

Diff for: src/patch/apply.js

+27-12
Original file line numberDiff line numberDiff line change
@@ -50,28 +50,43 @@ export function applyPatch(source, uniDiff, options = {}) {
5050
// Search best fit offsets for each hunk based on the previous ones
5151
for (let i = 0; i < hunks.length; i++) {
5252
let hunk = hunks[i],
53+
outOfLimits = 0,
54+
localOffset = 0,
5355
minLine = 0,
5456
toPos = offset + hunk.oldStart - 1;
5557

56-
for (let localOffset = 0; ; localOffset++) {
57-
if (toPos - localOffset < minLine
58-
|| lines.length < toPos + localOffset + hunk.oldLines) {
59-
return false;
58+
for (;;) {
59+
if (toPos + localOffset + hunk.oldLines <= lines.length) {
60+
if (hunkFits(hunk, toPos + localOffset)) {
61+
hunk.offset = offset += localOffset;
62+
break;
63+
}
64+
} else {
65+
outOfLimits++;
6066
}
6167

62-
if (hunkFits(hunk, toPos - localOffset)) {
63-
hunk.offset = offset -= localOffset;
64-
minLine = hunk.offset + hunk.oldStart + hunk.oldLines;
65-
break;
68+
// If trying to fit hunk outside both limits, return error
69+
if (outOfLimits === 2) {
70+
return false;
6671
}
67-
if (hunkFits(hunk, toPos + localOffset)) {
68-
hunk.offset = offset += localOffset;
69-
minLine = hunk.offset + hunk.oldStart + hunk.oldLines;
70-
break;
72+
73+
outOfLimits = 0;
74+
localOffset++;
75+
76+
if (minLine <= toPos - localOffset) {
77+
if (hunkFits(hunk, toPos - localOffset)) {
78+
hunk.offset = offset -= localOffset;
79+
break;
80+
}
81+
} else {
82+
outOfLimits++;
7183
}
7284
}
85+
86+
minLine = hunk.offset + hunk.oldStart + hunk.oldLines;
7387
}
7488

89+
// Apply patch hunks
7590
for (let i = 0; i < hunks.length; i++) {
7691
let hunk = hunks[i],
7792
toPos = hunk.offset + hunk.newStart - 1;

0 commit comments

Comments
 (0)