Code coverage report for lib/commit.js

Statements: 100% (43 / 43)      Branches: 100% (12 / 12)      Functions: 100% (12 / 12)      Lines: 100% (43 / 43)      Ignored: none     

All files » lib/ » commit.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 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158              1   1   1   1   1   1   1       1   1   1               1                     1 1 77   77   77                   1         3   3 3 3 16 16 12     16     3 12   3                         59   59   59 59   59 55     4                         2                       1 1                         3 57         1     1 1  
/**
 * @file commit 处理
 * @author chris<wfsr@foxmail.com>
 */
 
'use strict';
 
var _createClass = require('babel-runtime/helpers/create-class')['default'];
 
var _classCallCheck = require('babel-runtime/helpers/class-call-check')['default'];
 
var _slicedToArray = require('babel-runtime/helpers/sliced-to-array')['default'];
 
var _Object$assign = require('babel-runtime/core-js/object/assign')['default'];
 
var _Promise = require('babel-runtime/core-js/promise')['default'];
 
var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default'];
 
Object.defineProperty(exports, '__esModule', {
    value: true
});
 
var _git = require('./git');
 
var _file = require('./file');
 
var _file2 = _interopRequireDefault(_file);
 
/**
 * 匹配文件路径的正则
 *
 * @const
 * @type {RegExp}
 */
var FILE_REG = /^\s*\S+(?=\s*\|)/gm;
 
/**
 * Commit
 *
 * @class
 * @param {Object} options 配置项
 * @param {string} options.id 提交的 id
 * @param {string} options.date 提交时间
 */
 
var Commit = (function () {
    function Commit() {
        var options = arguments.length <= 0 || arguments[0] === undefined ? { id: '', date: new Date() } : arguments[0];
 
        _classCallCheck(this, Commit);
 
        _Object$assign(this, options);
    }
 
    /**
     * 从 git-show 输出中获取提交的文件路径
     *
     * @param {string} output git-show 的输出
     * @return {Promise.<File[]>}
     */
 
    _createClass(Commit, [{
        key: 'getFiles',
        value: function getFiles(output) {
            // istanbul ignore next
 
            var _this = this;
 
            var cid = this.id;
            var date = this.date;
            var files = (output.match(FILE_REG) || []).reduce(function (files, path) {
                path = path.trim();
                if (/.+\.(?:js|css|html)$/.test(path)) {
                    files.push(new _file2['default']({ cid: cid, path: path, date: date }));
                }
 
                return files;
            }, []);
 
            return _Promise.all(files.map(function (file) {
                return file.read();
            })).then(function (files) {
                return _this.files = files;
            });
        }
 
        /**
         * 从 git-log 输出中分析生成提交实例
         *
         * @param {string} log git-log 的输出
         * @return {?Commit}
         */
    }], [{
        key: 'from',
        value: function from(log) {
            var _log$replace$split = log.replace(/\s*(\r?\n)+/g, '').split(',');
 
            var _log$replace$split2 = _slicedToArray(_log$replace$split, 2);
 
            var id = _log$replace$split2[0];
            var date = _log$replace$split2[1];
 
            if (id && date) {
                return new Commit({ id: id, date: new Date(date) });
            }
 
            return null;
        }
 
        /**
         * 从 git-log 获取指定用户在某个时间段内的所有 Commit
         *
         * @param {string} name 提交代码的作者名字
         * @param {string} since git 格式的时间段表示
         * @return {Promise.<Commit[]>}
         */
    }, {
        key: 'getCommits',
        value: function getCommits(name, since) {
            return _git.git.run('log', '--author=' + name, '--since=\'' + since + '\'', '--pretty=format:%h,%ad').then(Commit.parse);
        }
 
        /**
         * 从 git-show 获取所有 Commit 的相关文件
         *
         * @param {Commit[]} commits Commit 列表
         * @return {Promise.<Array.<File[]>>}
         */
    }, {
        key: 'getFiles',
        value: function getFiles(commits) {
            return _Promise.all(commits.map(function (commit) {
                return _git.git.run('show', commit.id, '--pretty=format:', '--diff-filter=AM', '--stat=1200', '--stat-graph-width=1').then(commit.getFiles.bind(commit));
            }));
        }
 
        /**
         * 解释出 Commit 列表
         *
         * @param {string} logs git-log 的输出
         * @return {Commit[]}
         */
    }, {
        key: 'parse',
        value: function parse(logs) {
            return logs.split(/\r?\n/).map(function (log) {
                return Commit.from(log);
            }).filter(Boolean);
        }
    }]);
 
    return Commit;
})();
 
exports['default'] = Commit;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;base64,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Q2YsbUJBQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLEVBQUU7QUFDMUMsdUJBQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUMzQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3RCOzs7V0FqRmdCLE1BQU07OztxQkFBTixNQUFNIiwiZmlsZSI6ImNvbW1pdC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGUgY29tbWl0IOWkhOeQhlxuICogQGF1dGhvciBjaHJpczx3ZnNyQGZveG1haWwuY29tPlxuICovXG5cbmltcG9ydCB7Z2l0fSBmcm9tICcuL2dpdCc7XG5pbXBvcnQgRmlsZSBmcm9tICcuL2ZpbGUnO1xuXG4vKipcbiAqIOWMuemFjeaWh+S7tui3r+W+hOeahOato+WImVxuICpcbiAqIEBjb25zdFxuICogQHR5cGUge1JlZ0V4cH1cbiAqL1xuY29uc3QgRklMRV9SRUcgPSAvXlxccypcXFMrKD89XFxzKlxcfCkvZ207XG5cbi8qKlxuICogQ29tbWl0XG4gKlxuICogQGNsYXNzXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyDphY3nva7poblcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLmlkIOaPkOS6pOeahCBpZFxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuZGF0ZSDmj5DkuqTml7bpl7RcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29tbWl0IHtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7aWQ6ICcnLCBkYXRlOiBuZXcgRGF0ZSgpfSkge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOS7jiBnaXQtc2hvdyDovpPlh7rkuK3ojrflj5bmj5DkuqTnmoTmlofku7bot6/lvoRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvdXRwdXQgZ2l0LXNob3cg55qE6L6T5Ye6XG4gICAgICogQHJldHVybiB7UHJvbWlzZS48RmlsZVtdPn1cbiAgICAgKi9cbiAgICBnZXRGaWxlcyhvdXRwdXQpIHtcbiAgICAgICAgbGV0IGNpZCA9IHRoaXMuaWQ7XG4gICAgICAgIGxldCBkYXRlID0gdGhpcy5kYXRlO1xuICAgICAgICBsZXQgZmlsZXMgPSAob3V0cHV0Lm1hdGNoKEZJTEVfUkVHKSB8fCBbXSkucmVkdWNlKGZ1bmN0aW9uIChmaWxlcywgcGF0aCkge1xuICAgICAgICAgICAgcGF0aCA9IHBhdGgudHJpbSgpO1xuICAgICAgICAgICAgaWYgKC8uK1xcLig/OmpzfGNzc3xodG1sKSQvLnRlc3QocGF0aCkpIHtcbiAgICAgICAgICAgICAgICBmaWxlcy5wdXNoKG5ldyBGaWxlKHtjaWQsIHBhdGgsIGRhdGV9KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmaWxlcztcbiAgICAgICAgfSwgW10pO1xuXG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChmaWxlcy5tYXAoKGZpbGUpID0+IGZpbGUucmVhZCgpKSkudGhlbigoZmlsZXMpID0+IHRoaXMuZmlsZXMgPSBmaWxlcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5LuOIGdpdC1sb2cg6L6T5Ye65Lit5YiG5p6Q55Sf5oiQ5o+Q5Lqk5a6e5L6LXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbG9nIGdpdC1sb2cg55qE6L6T5Ye6XG4gICAgICogQHJldHVybiB7P0NvbW1pdH1cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbShsb2cpIHtcbiAgICAgICAgbGV0IFtpZCwgZGF0ZV0gPSBsb2cucmVwbGFjZSgvXFxzKihcXHI/XFxuKSsvZywgJycpLnNwbGl0KCcsJyk7XG5cbiAgICAgICAgaWYgKGlkICYmIGRhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29tbWl0KHtpZCwgZGF0ZTogbmV3IERhdGUoZGF0ZSl9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOS7jiBnaXQtbG9nIOiOt+WPluaMh+WumueUqOaIt+WcqOafkOS4quaXtumXtOauteWGheeahOaJgOaciSBDb21taXRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIOaPkOS6pOS7o+eggeeahOS9nOiAheWQjeWtl1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzaW5jZSBnaXQg5qC85byP55qE5pe26Ze05q616KGo56S6XG4gICAgICogQHJldHVybiB7UHJvbWlzZS48Q29tbWl0W10+fVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRDb21taXRzKG5hbWUsIHNpbmNlKSB7XG4gICAgICAgIHJldHVybiBnaXQucnVuKCdsb2cnLCAnLS1hdXRob3I9JyArIG5hbWUsICctLXNpbmNlPVxcJycgKyBzaW5jZSArICdcXCcnLCAnLS1wcmV0dHk9Zm9ybWF0OiVoLCVhZCcpXG4gICAgICAgICAgICAudGhlbihDb21taXQucGFyc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOS7jiBnaXQtc2hvdyDojrflj5bmiYDmnIkgQ29tbWl0IOeahOebuOWFs+aWh+S7tlxuICAgICAqXG4gICAgICogQHBhcmFtIHtDb21taXRbXX0gY29tbWl0cyBDb21taXQg5YiX6KGoXG4gICAgICogQHJldHVybiB7UHJvbWlzZS48QXJyYXkuPEZpbGVbXT4+fVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRGaWxlcyhjb21taXRzKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChjb21taXRzLm1hcChmdW5jdGlvbiAoY29tbWl0KSB7XG4gICAgICAgICAgICByZXR1cm4gZ2l0LnJ1bihcbiAgICAgICAgICAgICAgICAnc2hvdycsIGNvbW1pdC5pZCxcbiAgICAgICAgICAgICAgICAnLS1wcmV0dHk9Zm9ybWF0OicsICctLWRpZmYtZmlsdGVyPUFNJyxcbiAgICAgICAgICAgICAgICAnLS1zdGF0PTEyMDAnLCAnLS1zdGF0LWdyYXBoLXdpZHRoPTEnXG4gICAgICAgICAgICApLnRoZW4oY29tbWl0LmdldEZpbGVzLmJpbmQoY29tbWl0KSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDop6Pph4rlh7ogQ29tbWl0IOWIl+ihqFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxvZ3MgZ2l0LWxvZyDnmoTovpPlh7pcbiAgICAgKiBAcmV0dXJuIHtDb21taXRbXX1cbiAgICAgKi9cbiAgICBzdGF0aWMgcGFyc2UobG9ncykge1xuICAgICAgICByZXR1cm4gbG9ncy5zcGxpdCgvXFxyP1xcbi8pLm1hcChmdW5jdGlvbiAobG9nKSB7XG4gICAgICAgICAgICByZXR1cm4gQ29tbWl0LmZyb20obG9nKTtcbiAgICAgICAgfSkuZmlsdGVyKEJvb2xlYW4pO1xuICAgIH1cblxufVxuIl19