UNPKG

@jwpkg/gitversion

Version:

Gitversion is a complete customizable git-based release management system

228 lines 17.3 kB
"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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