UNPKG

t-comm

Version:

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

260 lines (255 loc) 7.54 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'); /** * 检测当前是否为Windows环境 */ function isWindows() { return process.platform === 'win32'; } 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 command; if (isWindows()) { // Windows兼容版本:去掉cat管道 command = "git log ".concat(mergeCommit ? '' : '--no-merges', " -1 --format=%s"); } else { // Unix/Linux/macOS版本:保持原有命令 command = "git log ".concat(mergeCommit ? '' : '--no-merges', " -1 --format=%s | cat"); } var infoMessage = node_nodeCommand.execCommand(command, 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; if (isWindows()) { // Windows兼容版本:避免使用Perl和管道操作 command = "git log ".concat(mergeCommit ? '' : '--no-merges', " -1 --date=iso --pretty=format:'{\"author\": \"%aN\", \"hash\": \"%h\", \"date\": \"%ad\", \"timeStamp\": \"%at\"}'"); } else { // Unix/Linux/macOS版本:保持原有命令 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 { if (isWindows()) { // Windows版本:直接解析JSON,去掉数组格式 if (stdout) { info = JSON.parse(stdout.trim()); } } else { // Unix/Linux/macOS版本:原有解析逻辑 info = JSON.parse(stdout)[0]; } } catch (err) { console.warn('[getGitCommitInfo] parse error', stdout); } 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'; var command; if (isWindows()) { // Windows兼容:使用git rev-list替代wc命令 command = "git rev-list --count ".concat(tag, "...HEAD --no-merges"); } else { // Unix/Linux/macOS版本:保持原有命令 command = "git log ".concat(tag, "...HEAD --no-merges --oneline | wc -l"); } var commits = node_nodeCommand.execCommand(command, root); return commits || '0'; } /** * 获取打标签的时间 * @private * @param {string} tag git标签 * @returns {string} 标签时间 */ function getGitTagTime(tag, root) { if (!tag) return ''; var command; if (isWindows()) { // Windows兼容:去掉cat管道,直接使用git log command = "git log -1 --format=%ai ".concat(tag); } else { // Unix/Linux/macOS版本:保持原有命令 command = "git log -1 --format=%ai ".concat(tag, " | cat"); } return node_nodeCommand.execCommand(command, 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;