@conventional-changelog/git-client
Version:
Simple git client for conventional changelog packages.
154 lines • 10.3 kB
JavaScript
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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