t-comm
Version:
专业、稳定、纯粹的工具库
260 lines (255 loc) • 7.54 kB
JavaScript
;
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;