/** * @file Thin execFile wrapper around the GitHub CLI (`gh`), used by * server/lib/ci-status.js to read Actions run state. Mirrors worktree.js's * git() helper's shape (cwd-scoped, throws with structured .gh details on * failure) but has no env-scrubbing to do — gh doesn't read GIT_* variables. * @author Nguyễn Ngọc Trí Vĩ */ const { execFile } = require("node:child_process"); const { promisify } = require("node:util"); const execFileAsync = promisify(execFile); /** * Run `gh ` in `cwd`. Resolves `{ stdout, stderr }` on a zero exit. * On failure, throws an Error with `.gh = { args, code, stderr }` — `.code` * is `"ENOGH"` when the binary itself is missing, otherwise the process's * exit code. * * @param {string} cwd * @param {string[]} args * @returns {Promise<{stdout: string, stderr: string}>} */ async function gh(cwd, args) { try { // As the folder's member under S3 (their own `gh auth`, their repository). const [cmd, argv] = require("./run-as").commandIn(cwd, "gh", args); const result = await execFileAsync(cmd, argv, { cwd, maxBuffer: 8 * 1024 * 1024 }); return { stdout: result.stdout, stderr: result.stderr }; } catch (err) { const error = new Error(`gh ${args[0]} failed`); error.code = err.code === "ENOENT" ? "ENOGH" : err.code; error.gh = { args, code: err.code, stderr: err.stderr || "" }; throw error; } } module.exports = { gh };