function git()

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}`));
      });
    });
  }