@jwpkg/gitversion
Version:
Gitversion is a complete customizable git-based release management system
228 lines • 17.3 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Git = void 0;
const crypto_1 = require("crypto");
const executor_1 = require("./executor");
const log_reporter_1 = require("./log-reporter");
const delim1 = 'E2B4D2F3-B7AF-4377-BF0F-D81F4E0723F3';
const delim2 = '25B7DA41-228B-4679-B2A2-86E328D3C3DE';
const endRegex = new RegExp(`${delim2}\\r?\\n?$`);
class Git {
cwd;
dryRun;
logger;
executor;
commandCache = new Map();
extraArgs = [];
_overrideCurrentBranch;
_overrideCurrentRef;
addConfiguration(key, value) {
this.extraArgs.push('-c', `${key}='${value}'`);
}
set overrideCurrentBranch(branch) {
this._overrideCurrentBranch = branch;
}
set overrideCurrentRef(ref) {
this._overrideCurrentRef = ref;
}
static async root() {
const executor = new executor_1.Executor(process.cwd(), new log_reporter_1.LogReporter());
return executor.exec(['git', 'rev-parse', '--show-toplevel']);
}
constructor(cwd, dryRun, logger, executor) {
this.cwd = cwd;
this.dryRun = dryRun;
this.logger = logger;
this.executor = executor;
}
async exec(...args) {
return this.executor.exec(['git', ...this.extraArgs, ...args], {
cwd: this.cwd,
});
}
async execSilent(...args) {
try {
return await this.executor.exec(['git', ...args], {
silent: true,
cwd: this.cwd,
});
}
catch (_error) {
return null;
}
}
async logs(sinceHash, relativeCwd) {
const formatFlag = `--format=format:%s${delim1}%cI${delim1}%H${delim1}%b${delim2}`;
const parseEntry = (entry) => {
if (entry && entry.length > 0) {
const [subject, date, hash, body] = entry.split(delim1);
return {
message: `${subject.trim()}\n\n${body.trim()}`,
date: new Date(date),
hash: hash.trim(),
};
}
return undefined;
};
const args = [
'log',
'--reverse',
formatFlag,
];
if (sinceHash) {
args.push(`${sinceHash}..`);
}
if (relativeCwd) {
args.push('--', relativeCwd);
}
const output = await this.execSilent(...args);
if (!output) {
return [];
}
return output
.replace(endRegex, '')
.split(delim2)
.map(parseEntry)
.filter((e) => !!e);
}
async versionTags(prefix = 'v') {
const prefixFilter = `${prefix}*`;
const parseEntry = (entry) => {
if (entry && entry.length > 0) {
const [hash, tagName] = entry.trim().split(delim1);
return {
hash,
tagName,
};
}
return undefined;
};
const args = [
'tag',
'--list',
'--merged=HEAD',
`--format=%(objectname)${delim1}%(refname:strip=2)${delim2}`,
prefixFilter,
];
const output = await this.execSilent(...args);
if (!output) {
return [];
}
const tags = output
.replace(endRegex, '')
.split(delim2)
.map(parseEntry)
.filter(e => e !== undefined)
.map(e => e);
return tags;
}
async addTag(tag, message) {
if (this.dryRun) {
this.logger.reportDryrun(`Would be adding git tag '${tag}' with message '${message}'`);
return;
}
else {
await this.exec('tag', '-a', tag, '-m', message);
}
}
async addAndCommitFiles(message, files) {
if (this.dryRun) {
this.logger.reportDryrun(`Would be adding files to git: \n${files.map(f => ` - ${f}`).join('\n')}`);
this.logger.reportDryrun(`Would commit added files to git with message: '${message}'`);
return;
}
else {
await this.exec('add', ...files);
await this.exec('commit', '-m', `${message} [skip ci]`, '--', ...files);
}
}
async push() {
const remoteName = await this.remoteName();
if (remoteName) {
if (this.dryRun) {
this.logger.reportDryrun(`Would be pushing git to remote: '${remoteName}'`);
}
else {
await this.exec('push', remoteName, '--follow-tags', `HEAD:${await this.currentRef()}`);
}
}
else {
this.logger.reportWarning('No remote found, can\'t push changes');
}
}
async currentBranch() {
if (this._overrideCurrentBranch) {
return this._overrideCurrentBranch;
}
return await this.execSilent('branch', '--show-current');
}
async currentRef() {
if (this._overrideCurrentRef) {
return this._overrideCurrentRef;
}
return await this.execSilent('symbolic-ref', 'HEAD');
}
async gitStatusHash() {
const commit = await this.exec('rev-parse', '--revs-only', 'HEAD');
const status = await this.exec('status', '--porcelain');
const cleanedStatus = status.split('\n').filter(l => {
return !(l.includes('package.json') || l.includes('CHANGELOG.md'));
}).join('\n');
const hash = (0, crypto_1.createHash)('sha256');
hash.update(commit);
hash.update(cleanedStatus);
return hash.digest().toString('base64');
}
async currentCommit() {
return await this.execSilent('rev-parse', '--verify', 'HEAD') ?? '';
}
async cleanChangeLogs() {
await this.execSilent('clean', '-f', '**/CHANGELOG.md', 'CHANGELOG.md');
await this.execSilent('checkout', 'CHANGELOG.md');
await this.execSilent('checkout', '**/CHANGELOG.md');
}
async remoteName() {
const result = this.commandCache.get('remote_name');
if (result) {
return result;
}
const gitRemotes = await this.execSilent('remote');
if (!gitRemotes)
return null;
const remotes = gitRemotes.split('\n');
if (remotes.length > 0) {
this.commandCache.set('remote_name', remotes[0]);
return remotes[0];
}
throw new Error('Invalid git, currently can\'t work with multiple remotes');
}
async remoteUrl(maxTries = 5) {
if (maxTries <= 0) {
return null;
}
const result = this.commandCache.get('remote_url');
if (result) {
return result;
}
try {
const remoteName = await this.remoteName();
if (!remoteName)
return null;
const result = await this.exec('config', '--get', `remote.${remoteName}.url`);
if (result) {
this.commandCache.set('remote_url', result);
}
else {
await new Promise(resolve => setTimeout(resolve, 500));
return this.remoteUrl(maxTries - 1);
}
return result;
}
catch (error) {
this.logger.reportError(`Error getting remote url: ${error}`);
return null;
}
}
}
exports.Git = Git;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvZ2l0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFvQztBQUVwQyx5Q0FBc0M7QUFDdEMsaURBQTZDO0FBRTdDLE1BQU0sTUFBTSxHQUFHLHNDQUFzQyxDQUFDO0FBQ3RELE1BQU0sTUFBTSxHQUFHLHNDQUFzQyxDQUFDO0FBQ3RELE1BQU0sUUFBUSxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsTUFBTSxXQUFXLENBQUMsQ0FBQztBQWFsRCxNQUFhLEdBQUc7SUF1Qk07SUFBcUI7SUFBeUI7SUFBNkI7SUF0QnZGLFlBQVksR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUM5QyxTQUFTLEdBQWEsRUFBRSxDQUFDO0lBQ3pCLHNCQUFzQixDQUFVO0lBQ2hDLG1CQUFtQixDQUFVO0lBRXJDLGdCQUFnQixDQUFDLEdBQVcsRUFBRSxLQUFhO1FBQ3pDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLEdBQUcsS0FBSyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxJQUFJLHFCQUFxQixDQUFDLE1BQWM7UUFDdEMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLE1BQU0sQ0FBQztJQUN2QyxDQUFDO0lBRUQsSUFBSSxrQkFBa0IsQ0FBQyxHQUFXO1FBQ2hDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxHQUFHLENBQUM7SUFDakMsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSTtRQUNmLE1BQU0sUUFBUSxHQUFHLElBQUksbUJBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSwwQkFBVyxFQUFFLENBQUMsQ0FBQztRQUNoRSxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQs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