Skip to content

Commit d8a3635

Browse files
Artyom Skrobovkpdecker
Artyom Skrobov
authored andcommitted
Gracefully accept invalid newStart in hunks, same as patch(1) does.
1 parent 6cab62c commit d8a3635

File tree

2 files changed

+48
-2
lines changed

2 files changed

+48
-2
lines changed

src/patch/apply.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,11 @@ export function applyPatch(source, uniDiff, options = {}) {
7979
}
8080

8181
// Apply patch hunks
82+
let diffOffset = 0;
8283
for (let i = 0; i < hunks.length; i++) {
8384
let hunk = hunks[i],
84-
toPos = hunk.offset + hunk.newStart - 1;
85-
if (hunk.newLines == 0) { toPos++; }
85+
toPos = hunk.oldStart + hunk.offset + diffOffset - 1;
86+
diffOffset += hunk.newLines - hunk.oldLines;
8687

8788
for (let j = 0; j < hunk.lines.length; j++) {
8889
let line = hunk.lines[j],

test/patch/apply.js

+45
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,51 @@ describe('patch/apply', function() {
416416
+ 'line5\n');
417417
});
418418

419+
it('should succeed when 1st hunk specifies invalid newStart', function() {
420+
expect(applyPatch(
421+
'line1\n'
422+
+ 'line2\n'
423+
+ 'line3\n'
424+
+ 'line5\n',
425+
426+
'--- test\theader1\n'
427+
+ '+++ test\theader2\n'
428+
+ '@@ -1,2 +2,3 @@\n'
429+
+ ' line3\n'
430+
+ '+line4\n'
431+
+ ' line5\n'))
432+
.to.equal(
433+
'line1\n'
434+
+ 'line2\n'
435+
+ 'line3\n'
436+
+ 'line4\n'
437+
+ 'line5\n');
438+
});
439+
440+
it('should succeed when 2nd hunk specifies invalid newStart', function() {
441+
expect(applyPatch(
442+
'line1\n'
443+
+ 'line2\n'
444+
+ 'line3\n'
445+
+ 'line5\n',
446+
447+
'--- test\theader1\n'
448+
+ '+++ test\theader2\n'
449+
+ '@@ -1,3 +1,2 @@\n'
450+
+ ' line1\n'
451+
+ '-line2\n'
452+
+ ' line3\n'
453+
+ '@@ -3,2 +3,3 @@\n'
454+
+ ' line3\n'
455+
+ '+line4\n'
456+
+ ' line5\n'))
457+
.to.equal(
458+
'line1\n'
459+
+ 'line3\n'
460+
+ 'line4\n'
461+
+ 'line5\n');
462+
});
463+
419464
it('should erase a file', function() {
420465
expect(applyPatch(
421466
'line1\n'

0 commit comments

Comments
 (0)