backport
Version:
A CLI tool that automates the process of backporting commits
93 lines • 3.69 kB
JavaScript
;
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