UNPKG

t-comm

Version:

专业、稳定、纯粹的工具库

215 lines (210 loc) 6.12 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var tslib_es6 = require('../tslib.es6-01322ba9.js'); var node_nodeCommand = require('../node/node-command.js'); require('@babel/runtime/helpers/typeof'); var DEFAULT_COMMIT_INFO = { author: 'UNKNOWN', message: 'UNKNOWN', hash: 'UNKNOWN', date: 'UNKNOWN', timeStamp: '0', branch: '' }; var localInfo = { curBranch: '', gotCurBranch: false, commitInfo: tslib_es6.__assign({}, DEFAULT_COMMIT_INFO), gotCommitInfo: false, gitAuthor: '', gotGitAuthor: false, commitMessage: '', gotCommitMessage: false, lastRoot: '' }; /** * 获取当前分支 * @returns {string} 分支名称 * * @example * * getGitCurBranch() * * // => master */ function getGitCurBranch(root, useCache) { if (useCache === void 0) { useCache = true; } if (useCache && localInfo.lastRoot === root && localInfo.gotCurBranch) { return localInfo.curBranch; } var res = ''; try { res = node_nodeCommand.execCommand('git symbolic-ref --short -q HEAD', root); } catch (err) { console.log('[getGitCurBranch] error: ', err); } localInfo.curBranch = res; localInfo.gotCurBranch = true; localInfo.lastRoot = root || ''; return res; } /** * 获取提交信息 * @param {string} root 根路径 * @param {boolean} mergeCommit 是否包含 merge 的提交 * @param {boolean} splitMessage 是否去掉提交信息的前缀 * @returns {string} 提交信息 * * @example * ```ts * getGitCommitMessage() * // '优化一部分文档' * ``` */ function getGitCommitMessage(root, mergeCommit, splitMessage, useCache) { if (mergeCommit === void 0) { mergeCommit = false; } if (splitMessage === void 0) { splitMessage = false; } if (useCache === void 0) { useCache = true; } if (useCache && localInfo.lastRoot === root && localInfo.gotCommitMessage) { return localInfo.commitMessage; } var infoMessage = node_nodeCommand.execCommand("git log ".concat(mergeCommit ? '' : '--no-merges', " -1 --format=%s | cat"), root); var result = ''; if (splitMessage) { result = (infoMessage.split(':')[1] || infoMessage.split(':')[1] || '').trim(); } else { result = infoMessage; } localInfo.gotCommitMessage = true; localInfo.commitMessage = result; localInfo.lastRoot = root || ''; return result; } /** * 获取提交信息 * @param {string} root 根路径 * @param {boolean} mergeCommit 是否包含 merge 的提交 * @param {boolean} splitMessage 是否去掉提交信息的前缀 * @returns {Object} 提交对象 * * @example * ```ts * getGitCommitInfo() * { * author: 'novlan1', * message: ' 优化一部分文档', * hash: '0cb71f9', * date: '2022-10-02 10:34:31 +0800', * timeStamp: '1664678071', * branch: 'master' * } * ``` */ function getGitCommitInfo(root, mergeCommit, splitMessage, useCache) { if (mergeCommit === void 0) { mergeCommit = false; } if (splitMessage === void 0) { splitMessage = false; } if (useCache === void 0) { useCache = true; } if (useCache && localInfo.lastRoot === root && localInfo.gotCommitInfo) { return localInfo.commitInfo; } var command = "\n git log ".concat(mergeCommit ? '' : '--no-merges', " -1 --date=iso --pretty=format:'{\"author\": \"%aN\", \"hash\": \"%h\", \"date\": \"%ad\", \"timeStamp\": \"%at\"},' $@ | perl -pe 'BEGIN{print \"[\"}; END{print \"]\n\"}' | perl -pe 's/},]/}]/'"); var stdout = node_nodeCommand.execCommand(command, root); var info = tslib_es6.__assign({}, DEFAULT_COMMIT_INFO); try { // 如果提交信息包括双引号,会解析失败 info = JSON.parse(stdout)[0]; } catch (err) { console.warn('[getGitCommitInfo] parse error'); } info.branch = getGitCurBranch(root, false); info.message = getGitCommitMessage(root, mergeCommit, splitMessage, false); localInfo.gotCommitInfo = true; localInfo.commitInfo = info; localInfo.lastRoot = root || ''; return info; } /** * 获取最新tag * @returns {string} 最新tag */ function getGitLastTag(root) { var fakeFirstTag = node_nodeCommand.execCommand('git tag -l', root); if (!fakeFirstTag) return ''; // 不能使用`git tag | head -1`,这个命令不准 var command = 'git describe --abbrev=0'; var tag = node_nodeCommand.execCommand(command, root); return tag || ''; } /** * 获取tag到head的提交数目 * @param {string} tag git标签 * @returns {string} tag至今的提交数目 */ function getGitCommitsBeforeTag(tag, root) { if (!tag) return '0'; return node_nodeCommand.execCommand("git log ".concat(tag, "...HEAD --no-merges --oneline | wc -l"), root); } /** * 获取打标签的时间 * @private * @param {string} tag git标签 * @returns {string} 标签时间 */ function getGitTagTime(tag, root) { if (!tag) return ''; return node_nodeCommand.execCommand("git log -1 --format=%ai ".concat(tag, " | cat"), root); } /** * 获取当前用户 * @param isPriorGit - 是否优先使用git用户信息 * @returns user */ function getGitAuthor(isPriorGit, root, useCache) { if (isPriorGit === void 0) { isPriorGit = false; } if (useCache === void 0) { useCache = true; } if (useCache && localInfo.lastRoot === root && localInfo.gotGitAuthor) { return localInfo.gitAuthor; } var envAuthor = process.env.VUE_APP_AUTHOR; var gitAuthor = ''; try { gitAuthor = node_nodeCommand.execCommand('git config user.name', root); } catch (err) { console.log('[getAuthor] err: ', err); } var result = ''; if (isPriorGit) { result = gitAuthor || envAuthor || ''; } else { result = envAuthor || gitAuthor || ''; } localInfo.gitAuthor = result; localInfo.gotGitAuthor = true; localInfo.lastRoot = root || ''; return result; } exports.getGitAuthor = getGitAuthor; exports.getGitCommitInfo = getGitCommitInfo; exports.getGitCommitMessage = getGitCommitMessage; exports.getGitCommitsBeforeTag = getGitCommitsBeforeTag; exports.getGitCurBranch = getGitCurBranch; exports.getGitLastTag = getGitLastTag; exports.getGitTagTime = getGitTagTime;