in projenrc/tag-release.ts [85:131]
function git(...args: string[]): Promise<string> {
// Quote arguments that contain "special" characters (spaces, etc..), since
// we have `shell: true` set as we want to be Windows-friendly.
args = args.map((arg) => (/[^\w.-]/im.test(arg) ? JSON.stringify(arg) : arg));
return new Promise((ok, ko) => {
const command = `git ${args.join(' ')}`;
if (verbose) {
console.debug(`Shelling out: '${command}'`);
}
const child = spawn('git', args, { shell: true, stdio: ['inherit', 'pipe', 'inherit'] });
const chunks = new Array<Buffer>();
let totalLength = 0;
child.stdout!.once('error', ko);
child.stdout!.on('data', (chunk) => {
chunk = Buffer.from(chunk);
chunks.push(chunk);
totalLength += chunk.length;
});
let stdoutResolve!: (value: string | PromiseLike<string>) => void;
let stdoutReject!: (reason: any) => void;
const stdout = new Promise<string>((resolve, reject) => {
stdoutResolve = resolve;
stdoutReject = reject;
});
child.stdout!.once('error', stdoutReject);
child.stdout!.once('close', () => stdoutResolve(Buffer.concat(chunks, totalLength).toString('utf-8').trimEnd()));
child.once('error', ko);
child.once('close', (status, signal) => {
if (status === 0) {
return ok(
verbose
? stdout.then((str) => {
console.debug(`Output of '${command}':`, str);
return str;
})
: stdout,
);
}
const reason = signal != null ? `signal ${signal}` : `status ${status}`;
ko(new Error(`'${command}' exited with ${reason}`));
});
});
}