UNPKG

backport

Version:

A CLI tool that automates the process of backporting commits

93 lines 3.69 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.spawnStream = exports.spawnPromise = exports.SpawnError = void 0; const child_process_1 = __importDefault(require("child_process")); const elastic_apm_node_1 = __importDefault(require("elastic-apm-node")); const logger_1 = require("./logger"); class SpawnError extends Error { constructor(context) { const cmdArgs = context.cmdArgs.join(' '); const message = `Code: ${context.code}, Args: "${cmdArgs}", Message: ${context.stderr.trim()}`; super(message); Error.captureStackTrace(this, SpawnError); this.name = 'SpawnError'; this.message = message; this.context = context; } } exports.SpawnError = SpawnError; async function spawnPromise(cmd, cmdArgs, cwd, isInteractive = false) { const spawnSpan = startSpawnSpan(cmd, cmdArgs); const fullCmd = getFullCmd(cmd, cmdArgs); logger_1.logger.info(`Running command: "${fullCmd}"`); return new Promise(function (resolve, reject) { const subprocess = child_process_1.default.spawn(cmd, cmdArgs, { cwd, // ensure that git commands return English error messages env: { ...process.env, LANG: 'C' }, ...(isInteractive ? { stdio: 'inherit' } : undefined), }); let stderr = ''; let stdout = ''; subprocess.stdout?.on('data', (data) => { stdout += data; }); subprocess.stderr?.on('data', (data) => { stderr += data; }); subprocess.on('close', (code) => { spawnSpan?.addLabels({ status_code: code, stderr: stderr, stdout: stdout, }); spawnSpan?.setOutcome('success'); if (code === 0 || code === null) { logger_1.logger.verbose(`Spawn success: code=${code} stderr=${stderr} stdout=${stdout}`); resolve({ cmdArgs, code, stderr, stdout }); } else { const err = new SpawnError({ cmdArgs, code, stderr, stdout }); logger_1.logger.verbose(`Error when running command: "${fullCmd}"`, err); reject(err); } }); subprocess.on('error', (err) => { spawnSpan?.setLabel('error_message', err.message); spawnSpan?.setOutcome('failure'); reject(err); }); }).finally(() => { spawnSpan?.end(); }); } exports.spawnPromise = spawnPromise; const spawnStream = (cmd, cmdArgs) => { const spawnSpan = startSpawnSpan(cmd, cmdArgs); const res = child_process_1.default.spawn(cmd, cmdArgs, { env: { ...process.env, LANG: 'C' }, }); res.on('close', (code) => { const isSuccess = code === 0 || code === null; spawnSpan?.setLabel('status_code', code); spawnSpan?.setOutcome(isSuccess ? 'success' : 'failure'); spawnSpan?.end(); }); return res; }; exports.spawnStream = spawnStream; function startSpawnSpan(cmd, cmdArgs) { const span = elastic_apm_node_1.default.startSpan(`Spawn: "${cmd}"`); const fullCmd = getFullCmd(cmd, cmdArgs); const firstCmdArg = cmdArgs.filter((cmdArg) => !cmdArg.startsWith('--') && !cmdArg.startsWith('-'))[0]; span?.setType('spawn', cmd, firstCmdArg); span?.setLabel(`cmd`, fullCmd); return span; } function getFullCmd(cmd, cmdArgs) { return `${cmd} ${cmdArgs.join(' ')}`; } //# sourceMappingURL=child-process-promisified.js.map