UNPKG

@conventional-changelog/git-client

Version:
154 lines 10.3 kB
import { spawn, stdoutSpawn, splitStream, getFirstFromStream, formatArgs, toArray } from './utils.js'; const SCISSOR = '------------------------ >8 ------------------------'; /** * Wrapper around Git CLI. */ export class GitClient { cwd; debug; constructor(cwd, debug = false) { this.cwd = cwd; this.debug = debug; } formatArgs(...args) { const finalArgs = formatArgs(...args); if (this.debug) { this.debug(finalArgs); } return finalArgs; } /** * Get raw commits stream. * @param params * @param params.path - Read commits from specific path. * @param params.from - Start commits range. * @param params.to - End commits range. * @param params.format - Commits format. * @yields Raw commits data. */ async *getRawCommits(params = {}) { const { path, from = '', to = 'HEAD', format = '%B', ignore, reverse, merges, since } = params; const shouldNotIgnore = ignore ? (chunk) => !ignore.test(chunk) : () => true; const args = this.formatArgs('log', `--format=${format}%n${SCISSOR}`, since && `--since=${since instanceof Date ? since.toISOString() : since}`, reverse && '--reverse', merges && '--merges', merges === false && '--no-merges', [from, to].filter(Boolean).join('..'), ...path ? ['--', ...toArray(path)] : []); const stdout = stdoutSpawn('git', args, { cwd: this.cwd }); const commitsStream = splitStream(stdout, `${SCISSOR}\n`); let chunk; for await (chunk of commitsStream) { if (shouldNotIgnore(chunk)) { yield chunk; } } } /** * Get tags stream. * @yields Tags */ async *getTags() { const tagRegex = /tag:\s*(.+?)[,)]/gi; const args = this.formatArgs('log', '--decorate', '--no-color', '--date-order'); const stdout = stdoutSpawn('git', args, { cwd: this.cwd }); let chunk; let matches; let tag; for await (chunk of stdout) { matches = chunk.toString().trim().matchAll(tagRegex); for ([, tag] of matches) { yield tag; } } } /** * Get last tag. * @returns Last tag, `null` if not found. */ async getLastTag() { return getFirstFromStream(this.getTags()); } /** * Check file is ignored via .gitignore. * @param file - Path to target file. * @returns Boolean value. */ async checkIgnore(file) { const args = this.formatArgs('check-ignore', '--', file); try { await spawn('git', args, { cwd: this.cwd }); return true; } catch (err) { return false; } } /** * Add files to git index. * @param files - Files to stage. */ async add(files) { const args = this.formatArgs('add', '--', ...toArray(files)); await spawn('git', args, { cwd: this.cwd }); } /** * Commit changes. * @param params * @param params.verify * @param params.sign * @param params.files * @param params.message */ async commit(params) { const { verify = true, sign = false, files = [], message } = params; const args = this.formatArgs('commit', !verify && '--no-verify', sign && '-S', '-m', message, '--', ...files); await spawn('git', args, { cwd: this.cwd }); } /** * Create a tag for the current commit. * @param params * @param params.sign * @param params.name * @param params.message */ async tag(params) { let { sign = false, name, message } = params; if (sign) { message = ''; } const args = this.formatArgs('tag', sign && '-s', message && '-a', ...message ? ['-m', message] : [], '--', name); await spawn('git', args, { cwd: this.cwd }); } /** * Get current branch name. * @returns Current branch name. */ async getCurrentBranch() { const args = this.formatArgs('rev-parse', '--abbrev-ref', 'HEAD'); const branch = (await spawn('git', args, { cwd: this.cwd })).toString().trim(); return branch; } /** * Push changes to remote. * @param branch */ async push(branch) { const args = this.formatArgs('push', '--follow-tags', 'origin', '--', branch); await spawn('git', args, { cwd: this.cwd }); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2l0Q2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0dpdENsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsS0FBSyxFQUNMLFdBQVcsRUFDWCxXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLFVBQVUsRUFDVixPQUFPLEVBQ1IsTUFBTSxZQUFZLENBQUE7QUFRbkIsTUFBTSxPQUFPLEdBQUcsc0RBQXNELENBQUE7QUFFdEU7O0dBRUc7QUFDSCxNQUFNLE9BQU8sU0FBUztJQUVUO0lBQ1E7SUFGbkIsWUFDVyxHQUFXLEVBQ0gsUUFBMkMsS0FBSztRQUR4RCxRQUFHLEdBQUgsR0FBRyxDQUFRO1FBQ0gsVUFBSyxHQUFMLEtBQUssQ0FBMkM7SUFDaEUsQ0FBQztJQUVJLFVBQVUsQ0FBQyxHQUFHLElBQVc7UUFDL0IsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUE7UUFFckMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2QsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQTtTQUN0QjtRQUVELE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILEtBQUssQ0FBQSxDQUFFLGFBQWEsQ0FBQyxTQUF1QixFQUFFO1FBQzVDLE1BQU0sRUFDSixJQUFJLEVBQ0osSUFBSSxHQUFHLEVBQUUsRUFDVCxFQUFFLEdBQUcsTUFBTSxFQUNYLE1BQU0sR0FBRyxJQUFJLEVBQ2IsTUFBTSxFQUNOLE9BQU8sRUFDUCxNQUFNLEVBQ04sS0FBSyxFQUNOLEdBQUcsTUFBTSxDQUFBO1FBQ1YsTUFBTSxlQUFlLEdBQUcsTUFBTTtZQUM1QixDQUFDLENBQUMsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDeEMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQTtRQUNk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