/**
* @file 分析有 diff 的行
* @author chris<wfsr@foxmail.com>
*/
/**
* 新文件的标志
*
* @const
* @type {string}
*/
'use strict';
Object.defineProperty(exports, '__esModule', {
value: true
});
var NEW_FILE_MODE = 'new file mode';
/**
* 匹配 diff 中的行数的正则
*
* @const
* @type {RegExp}
*/
var CHANGED_LINE_REG = /^@@ \-\d+,\d+ \+(\d+),(\d+) @@/;
/**
* 是否新增文件
*
* @param {string} diffs diff 输出的字符
* @return {boolean} 是否新增加文件的结果
*/
var isNewFile = function isNewFile(diffs) {
var secondLine = diffs.indexOf('\n');
return diffs.substr(secondLine + 1, NEW_FILE_MODE.length) === NEW_FILE_MODE;
};
/**
* 从 diff 输出中解释出有改变的行数及适用于 `fecs --lines` 过滤的 range
*
* @param {string} diffs diff 的输出字符
* @param {boolean} isNew 是否新文件
* @return {Object} 包含变更行数 lines 及 range 的对象
*/
function parse(diffs, isNew) {
diffs = diffs.slice(diffs.indexOf('@@')).split(/\r?\n/);
var lines = 0;
var range = [];
var line = undefined;
var index = undefined;
var last = undefined;
var section = undefined;
function push() {
if (!section || !section[0]) {
return;
}
if (section[1]) {
if (section[1] - section[0] < 2) {
range.push(section[0]);
range.push(section[1]);
} else {
range.push('[' + section + ']');
}
} else {
range.push(section[0]);
}
section.length = 0;
}
while ((line = diffs.shift()) != null) {
var match = line.match(CHANGED_LINE_REG);
if (match) {
if (isNew) {
lines = match[2] | 0;
break;
}
index = match[1] | 0;
} else {
switch (line[0]) {
case '-':
break;
case '+':
if (last) {
section[1] = index + '';
} else {
section = [index + ''];
}
last = index;
lines++;
index++;
break;
default:
index++;
last = 0;
push();
break;
}
}
}
if (section && section.length) {
push();
}
return { lines: lines, range: range };
}
/**
* 从 diff 输出中分析
*
* @param {string} diffs diff 的输出
* @return {Object} 包含变更行数 lines 及 range 的对象
*/
exports['default'] = function (diffs) {
var isNew = isNewFile(diffs);
return parse(diffs, isNew);
};
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;base64,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QUFDO0FBQ1Isd0JBQUksR0FBRyxDQUFDLENBQUM7QUFDVCx3QkFBSSxFQUFFLENBQUM7QUFDUCwwQkFBTTtBQUFBLGFBQ2I7U0FDSjtLQUNKOztBQUVELFFBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7QUFDM0IsWUFBSSxFQUFFLENBQUM7S0FDVjs7QUFFRCxXQUFPLEVBQUMsS0FBSyxFQUFMLEtBQUssRUFBRSxLQUFLLEVBQUwsS0FBSyxFQUFDLENBQUM7Q0FFekI7Ozs7Ozs7OztxQkFRYyxVQUFVLEtBQUssRUFBRTtBQUM1QixRQUFJLEtBQUssR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDN0IsV0FBTyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0NBQzlCIiwiZmlsZSI6ImFuYWx5c2UuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIOWIhuaekOaciSBkaWZmIOeahOihjFxuICogQGF1dGhvciBjaHJpczx3ZnNyQGZveG1haWwuY29tPlxuICovXG5cbi8qKlxuICog5paw5paH5Lu255qE5qCH5b+XXG4gKlxuICogQGNvbnN0XG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5jb25zdCBORVdfRklMRV9NT0RFID0gJ25ldyBmaWxlIG1vZGUnO1xuXG4vKipcbiAqIOWMuemFjSBkaWZmIOS4reeahOihjOaVsOeahOato+WImVxuICpcbiAqIEBjb25zdFxuICogQHR5cGUge1JlZ0V4cH1cbiAqL1xuY29uc3QgQ0hBTkdFRF9MSU5FX1JFRyA9IC9eQEAgXFwtXFxkKyxcXGQrIFxcKyhcXGQrKSwoXFxkKykgQEAvO1xuXG4vKipcbiAqIOaYr+WQpuaWsOWinuaWh+S7tlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkaWZmcyBkaWZmIOi+k+WHuueahOWtl+esplxuICogQHJldHVybiB7Ym9vbGVhbn0gIOaYr+WQpuaWsOWinuWKoOaWh+S7tueahOe7k+aenFxuICovXG5sZXQgaXNOZXdGaWxlID0gZnVuY3Rpb24gKGRpZmZzKSB7XG4gICAgbGV0IHNlY29uZExpbmUgPSBkaWZmcy5pbmRleE9mKCdcXG4nKTtcbiAgICByZXR1cm4gZGlmZnMuc3Vic3RyKHNlY29uZExpbmUgKyAxLCBORVdfRklMRV9NT0RFLmxlbmd0aCkgPT09IE5FV19GSUxFX01PREU7XG59O1xuXG4vKipcbiAqIOS7jiBkaWZmIOi+k+WHuuS4reino+mHiuWHuuacieaUueWPmOeahOihjOaVsOWPiumAgueUqOS6jiBgZmVjcyAtLWxpbmVzYCDov4fmu6TnmoQgcmFuZ2VcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlmZnMgIGRpZmYg55qE6L6T5Ye65a2X56ymXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzTmV3IOaYr+WQpuaWsOaWh+S7tlxuICogQHJldHVybiB7T2JqZWN0fSDljIXlkKvlj5jmm7TooYzmlbAgbGluZXMg5Y+KIHJhbmdlIOeahOWvueixoVxuICovXG5mdW5jdGlvbiBwYXJzZShkaWZmcywgaXNOZXcpIHtcbiAgICBkaWZmcyA9IGRpZmZzLnNsaWNlKGRpZmZzLmluZGV4T2YoJ0BAJykpLnNwbGl0KC9cXHI/XFxuLyk7XG5cbiAgICBsZXQgbGluZXMgPSAwO1xuICAgIGxldCByYW5nZSA9IFtdO1xuICAgIGxldCBsaW5lO1xuICAgIGxldCBpbmRleDtcbiAgICBsZXQgbGFzdDtcbiAgICBsZXQgc2VjdGlvbjtcblxuICAgIGZ1bmN0aW9uIHB1c2goKSB7XG4gICAgICAgIGlmICghc2VjdGlvbiB8fCAhc2VjdGlvblswXSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlY3Rpb25bMV0pIHtcbiAgICAgICAgICAgIGlmIChzZWN0aW9uWzFdIC0gc2VjdGlvblswXSA8IDIpIHtcbiAgICAgICAgICAgICAgICByYW5nZS5wdXNoKHNlY3Rpb25bMF0pO1xuICAgICAgICAgICAgICAgIHJhbmdlLnB1c2goc2VjdGlvblsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByYW5nZS5wdXNoKCdbJyArIHNlY3Rpb24gKyAnXScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmFuZ2UucHVzaChzZWN0aW9uWzBdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlY3Rpb24ubGVuZ3RoID0gMDtcbiAgICB9XG5cbiAgICB3aGlsZSAoKGxpbmUgPSBkaWZmcy5zaGlmdCgpKSAhPSBudWxsKSB7XG4gICAgICAgIHZhciBtYXRjaCA9IGxpbmUubWF0Y2goQ0hBTkdFRF9MSU5FX1JFRyk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgaWYgKGlzTmV3KSB7XG4gICAgICAgICAgICAgICAgbGluZXMgPSBtYXRjaFsyXSB8IDA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbmRleCA9IG1hdGNoWzFdIHwgMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN3aXRjaCAobGluZVswXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJy0nOlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICcrJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25bMV0gPSBpbmRleCArICcnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiA9IFtpbmRleCArICcnXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsYXN0ID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIGxpbmVzKys7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgIGxhc3QgPSAwO1xuICAgICAgICAgICAgICAgICAgICBwdXNoKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNlY3Rpb24gJiYgc2VjdGlvbi5sZW5ndGgpIHtcbiAgICAgICAgcHVzaCgpO1xuICAgIH1cblxuICAgIHJldHVybiB7bGluZXMsIHJhbmdlfTtcblxufVxuXG4vKipcbiAqIOS7jiBkaWZmIOi+k+WHuuS4reWIhuaekFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkaWZmcyBkaWZmIOeahOi+k+WHulxuICogQHJldHVybiB7T2JqZWN0fSDljIXlkKvlj5jmm7TooYzmlbAgbGluZXMg5Y+KIHJhbmdlIOeahOWvueixoVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoZGlmZnMpIHtcbiAgICBsZXQgaXNOZXcgPSBpc05ld0ZpbGUoZGlmZnMpO1xuICAgIHJldHVybiBwYXJzZShkaWZmcywgaXNOZXcpO1xufVxuIl19 |