@@ -50,28 +50,43 @@ export function applyPatch(source, uniDiff, options = {}) {
50
50
// Search best fit offsets for each hunk based on the previous ones
51
51
for ( let i = 0 ; i < hunks . length ; i ++ ) {
52
52
let hunk = hunks [ i ] ,
53
+ outOfLimits = 0 ,
54
+ localOffset = 0 ,
53
55
minLine = 0 ,
54
56
toPos = offset + hunk . oldStart - 1 ;
55
57
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 ++ ;
60
66
}
61
67
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 ;
66
71
}
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 ++ ;
71
83
}
72
84
}
85
+
86
+ minLine = hunk . offset + hunk . oldStart + hunk . oldLines ;
73
87
}
74
88
89
+ // Apply patch hunks
75
90
for ( let i = 0 ; i < hunks . length ; i ++ ) {
76
91
let hunk = hunks [ i ] ,
77
92
toPos = hunk . offset + hunk . newStart - 1 ;
0 commit comments