Code coverage report for lib/analyse.js

Statements: 92.16% (47 / 51)      Branches: 80.95% (17 / 21)      Functions: 100% (4 / 4)      Lines: 92.16% (47 / 51)      Ignored: none     

All files » lib/ » analyse.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125                          1     1               1               1 1 1                   1 1   1 1 1 1 1 1   1 7 5     2 1 1 1         1     2     1 10 10 1       1   9       3 1   2   3 3 3 3   6 6 6 6         1 1     1                   1 1 1     1  
/**
 * @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]) {
            Eif (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) {
            Iif (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;
            }
        }
    }
 
    Eif (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