2017-05-28 00:38:50 +02:00
|
|
|
/*istanbul ignore start*/'use strict';
|
|
|
|
|
|
|
|
exports.__esModule = true;
|
|
|
|
exports. /*istanbul ignore end*/applyPatch = applyPatch;
|
|
|
|
/*istanbul ignore start*/exports. /*istanbul ignore end*/applyPatches = applyPatches;
|
|
|
|
|
|
|
|
var /*istanbul ignore start*/_parse = require('./parse') /*istanbul ignore end*/;
|
|
|
|
|
|
|
|
var /*istanbul ignore start*/_distanceIterator = require('../util/distance-iterator') /*istanbul ignore end*/;
|
|
|
|
|
|
|
|
/*istanbul ignore start*/
|
|
|
|
var _distanceIterator2 = _interopRequireDefault(_distanceIterator);
|
|
|
|
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
|
|
|
|
|
|
|
/*istanbul ignore end*/function applyPatch(source, uniDiff) {
|
|
|
|
/*istanbul ignore start*/var /*istanbul ignore end*/options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
|
|
|
|
|
|
|
|
if (typeof uniDiff === 'string') {
|
|
|
|
uniDiff = /*istanbul ignore start*/(0, _parse.parsePatch) /*istanbul ignore end*/(uniDiff);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (Array.isArray(uniDiff)) {
|
|
|
|
if (uniDiff.length > 1) {
|
|
|
|
throw new Error('applyPatch only works with a single input.');
|
|
|
|
}
|
|
|
|
|
|
|
|
uniDiff = uniDiff[0];
|
|
|
|
}
|
|
|
|
|
|
|
|
// Apply the diff to the input
|
|
|
|
var lines = source.split(/\r\n|[\n\v\f\r\x85]/),
|
|
|
|
delimiters = source.match(/\r\n|[\n\v\f\r\x85]/g) || [],
|
|
|
|
hunks = uniDiff.hunks,
|
|
|
|
compareLine = options.compareLine || function (lineNumber, line, operation, patchContent) /*istanbul ignore start*/{
|
|
|
|
return (/*istanbul ignore end*/line === patchContent
|
|
|
|
);
|
|
|
|
},
|
|
|
|
errorCount = 0,
|
|
|
|
fuzzFactor = options.fuzzFactor || 0,
|
|
|
|
minLine = 0,
|
|
|
|
offset = 0,
|
|
|
|
removeEOFNL = /*istanbul ignore start*/void 0 /*istanbul ignore end*/,
|
|
|
|
addEOFNL = /*istanbul ignore start*/void 0 /*istanbul ignore end*/;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Checks if the hunk exactly fits on the provided location
|
|
|
|
*/
|
|
|
|
function hunkFits(hunk, toPos) {
|
|
|
|
for (var j = 0; j < hunk.lines.length; j++) {
|
|
|
|
var line = hunk.lines[j],
|
|
|
|
operation = line[0],
|
|
|
|
content = line.substr(1);
|
|
|
|
|
|
|
|
if (operation === ' ' || operation === '-') {
|
|
|
|
// Context sanity check
|
|
|
|
if (!compareLine(toPos + 1, lines[toPos], operation, content)) {
|
|
|
|
errorCount++;
|
|
|
|
|
|
|
|
if (errorCount > fuzzFactor) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
toPos++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Search best fit offsets for each hunk based on the previous ones
|
|
|
|
for (var i = 0; i < hunks.length; i++) {
|
|
|
|
var hunk = hunks[i],
|
|
|
|
maxLine = lines.length - hunk.oldLines,
|
|
|
|
localOffset = 0,
|
|
|
|
toPos = offset + hunk.oldStart - 1;
|
|
|
|
|
|
|
|
var iterator = /*istanbul ignore start*/(0, _distanceIterator2['default']) /*istanbul ignore end*/(toPos, minLine, maxLine);
|
|
|
|
|
|
|
|
for (; localOffset !== undefined; localOffset = iterator()) {
|
|
|
|
if (hunkFits(hunk, toPos + localOffset)) {
|
|
|
|
hunk.offset = offset += localOffset;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (localOffset === undefined) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Set lower text limit to end of the current hunk, so next ones don't try
|
|
|
|
// to fit over already patched text
|
|
|
|
minLine = hunk.offset + hunk.oldStart + hunk.oldLines;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Apply patch hunks
|
2017-08-14 05:01:11 +02:00
|
|
|
var diffOffset = 0;
|
2017-05-28 00:38:50 +02:00
|
|
|
for (var _i = 0; _i < hunks.length; _i++) {
|
|
|
|
var _hunk = hunks[_i],
|
2017-08-14 05:01:11 +02:00
|
|
|
_toPos = _hunk.oldStart + _hunk.offset + diffOffset - 1;
|
|
|
|
diffOffset += _hunk.newLines - _hunk.oldLines;
|
2017-05-28 00:38:50 +02:00
|
|
|
|
|
|
|
for (var j = 0; j < _hunk.lines.length; j++) {
|
|
|
|
var line = _hunk.lines[j],
|
|
|
|
operation = line[0],
|
|
|
|
content = line.substr(1),
|
|
|
|
delimiter = _hunk.linedelimiters[j];
|
|
|
|
|
|
|
|
if (operation === ' ') {
|
|
|
|
_toPos++;
|
|
|
|
} else if (operation === '-') {
|
|
|
|
lines.splice(_toPos, 1);
|
|
|
|
delimiters.splice(_toPos, 1);
|
|
|
|
/* istanbul ignore else */
|
|
|
|
} else if (operation === '+') {
|
|
|
|
lines.splice(_toPos, 0, content);
|
|
|
|
delimiters.splice(_toPos, 0, delimiter);
|
|
|
|
_toPos++;
|
|
|
|
} else if (operation === '\\') {
|
|
|
|
var previousOperation = _hunk.lines[j - 1] ? _hunk.lines[j - 1][0] : null;
|
|
|
|
if (previousOperation === '+') {
|
|
|
|
removeEOFNL = true;
|
|
|
|
} else if (previousOperation === '-') {
|
|
|
|
addEOFNL = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Handle EOFNL insertion/removal
|
|
|
|
if (removeEOFNL) {
|
|
|
|
while (!lines[lines.length - 1]) {
|
|
|
|
lines.pop();
|
|
|
|
delimiters.pop();
|
|
|
|
}
|
|
|
|
} else if (addEOFNL) {
|
|
|
|
lines.push('');
|
|
|
|
delimiters.push('\n');
|
|
|
|
}
|
|
|
|
for (var _k = 0; _k < lines.length - 1; _k++) {
|
|
|
|
lines[_k] = lines[_k] + delimiters[_k];
|
|
|
|
}
|
|
|
|
return lines.join('');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Wrapper that supports multiple file patches via callbacks.
|
|
|
|
function applyPatches(uniDiff, options) {
|
|
|
|
if (typeof uniDiff === 'string') {
|
|
|
|
uniDiff = /*istanbul ignore start*/(0, _parse.parsePatch) /*istanbul ignore end*/(uniDiff);
|
|
|
|
}
|
|
|
|
|
|
|
|
var currentIndex = 0;
|
|
|
|
function processIndex() {
|
|
|
|
var index = uniDiff[currentIndex++];
|
|
|
|
if (!index) {
|
|
|
|
return options.complete();
|
|
|
|
}
|
|
|
|
|
|
|
|
options.loadFile(index, function (err, data) {
|
|
|
|
if (err) {
|
|
|
|
return options.complete(err);
|
|
|
|
}
|
|
|
|
|
|
|
|
var updatedContent = applyPatch(data, index, options);
|
|
|
|
options.patched(index, updatedContent, function (err) {
|
|
|
|
if (err) {
|
|
|
|
return options.complete(err);
|
|
|
|
}
|
|
|
|
|
|
|
|
processIndex();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
processIndex();
|
|
|
|
}
|
2017-08-14 05:01:11 +02:00
|
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9hcHBseS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Z0NBR2dCLFUsR0FBQSxVO3lEQWdJQSxZLEdBQUEsWTs7QUFuSWhCLEkseUJBQUEsMkIsd0JBQUE7O0FBQ0EsSSx5QkFBQSx3RCx3QkFBQTs7Ozs7Ozt1QkFFTyxTQUFTLFVBQVQsQ0FBb0IsTUFBcEIsRUFBNEIsT0FBNUIsRUFBbUQ7MkJBQUEsSSx1QkFBZCxPQUFjLHlEQUFKLEVBQUk7O0FBQ3hELE1BQUksT0FBTyxPQUFQLEtBQW1CLFFBQXZCLEVBQWlDO0FBQy9CLGMseUJBQVUsc0Isd0JBQUEsQ0FBVyxPQUFYLENBQVY7QUFDRDs7QUFFRCxNQUFJLE1BQU0sT0FBTixDQUFjLE9BQWQsQ0FBSixFQUE0QjtBQUMxQixRQUFJLFFBQVEsTUFBUixHQUFpQixDQUFyQixFQUF3QjtBQUN0QixZQUFNLElBQUksS0FBSixDQUFVLDRDQUFWLENBQU47QUFDRDs7QUFFRCxjQUFVLFFBQVEsQ0FBUixDQUFWO0FBQ0Q7OztBQUdELE1BQUksUUFBUSxPQUFPLEtBQVAsQ0FBYSxxQkFBYixDQUFaO0FBQUEsTUFDSSxhQUFhLE9BQU8sS0FBUCxDQUFhLHNCQUFiLEtBQXdDLEVBRHpEO0FBQUEsTUFFSSxRQUFRLFFBQVEsS0FGcEI7QUFBQSxNQUlJLGNBQWMsUUFBUSxXQUFSLElBQXdCLFVBQUMsVUFBRCxFQUFhLElBQWIsRUFBbUIsU0FBbkIsRUFBOEIsWUFBOUIsRSx5QkFBQTtBQUFBLFcsd0JBQStDLFNBQVM7QUFBeEQ7QUFBQSxHQUoxQztBQUFBLE1BS0ksYUFBYSxDQUxqQjtBQUFBLE1BTUksYUFBYSxRQUFRLFVBQVIsSUFBc0IsQ0FOdkM7QUFBQSxNQU9JLFVBQVUsQ0FQZDtBQUFBLE1BUUksU0FBUyxDQVJiO0FBQUEsTUFVSSxjLHlCQUFBLE0sd0JBVko7QUFBQSxNQVdJLFcseUJBQUEsTSx3QkFYSjs7Ozs7QUFnQkEsV0FBUyxRQUFULENBQWtCLElBQWxCLEVBQXdC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
|