refactor: limit stderr length to 50 lines
Some checks failed
Release Workflow / determine-release-type (push) Has been cancelled
Release Workflow / checks (push) Has been cancelled
Release Workflow / e2e-tests (push) Has been cancelled
Release Workflow / build-images (push) Has been cancelled
Release Workflow / publish-release (push) Has been cancelled

This commit is contained in:
Nicolas Meienberger 2026-03-21 20:37:13 +01:00
parent 49a030aa41
commit 20db67b89b
2 changed files with 19 additions and 5 deletions

View file

@ -206,7 +206,7 @@ describe("safeSpawn", () => {
expect(result.error).toBe("err_last");
});
test("stderr keeps the full stderr output", async () => {
test("stderr keeps the captured stderr output", async () => {
const result = await safeSpawn({
command: "sh",
args: ["-c", "echo err_first >&2 && echo err_last >&2 && exit 1"],
@ -215,6 +215,15 @@ describe("safeSpawn", () => {
expect(result.stderr).toBe("err_first\nerr_last");
});
test("stderr keeps only the last 50 stderr lines", async () => {
const result = await safeSpawn({
command: "sh",
args: ["-c", "i=1; while [ $i -le 55 ]; do echo err_$i >&2; i=$((i+1)); done; exit 1"],
});
expect(result.stderr).toBe(Array.from({ length: 50 }, (_, index) => `err_${index + 6}`).join("\n"));
});
test("returns exitCode -1 when the command is not found", async () => {
const result = await safeSpawn({
command: "this-command-does-not-exist-zerobyte",

View file

@ -62,6 +62,8 @@ export type SpawnResult = {
stderr?: string;
};
const MAX_STDERR_LINES = 50;
export function safeSpawn(params: SafeSpawnParamsLines): Promise<SpawnResult>;
export function safeSpawn(params: SafeSpawnParamsRaw): Promise<SpawnResult>;
export function safeSpawn(params: SafeSpawnParams): Promise<SpawnResult> {
@ -71,7 +73,7 @@ export function safeSpawn(params: SafeSpawnParams): Promise<SpawnResult> {
let lastStdout = "";
let lastStderr = "";
let stderr = "";
const stderrLines: string[] = [];
return new Promise<SpawnResult>((resolve) => {
const child = spawn(command, args, {
@ -103,7 +105,10 @@ export function safeSpawn(params: SafeSpawnParams): Promise<SpawnResult> {
rlErr.on("line", (line) => {
if (onStderr) onStderr(line);
stderr += `${line}\n`;
stderrLines.push(line);
if (stderrLines.length > MAX_STDERR_LINES) {
stderrLines.shift();
}
const trimmed = line.trim();
if (trimmed.length > 0) {
lastStderr = line;
@ -118,7 +123,7 @@ export function safeSpawn(params: SafeSpawnParams): Promise<SpawnResult> {
exitCode: -1,
summary: lastStdout,
error: err.message || lastStderr,
stderr: stderr.trim(),
stderr: stderrLines.join("\n"),
});
});
@ -127,7 +132,7 @@ export function safeSpawn(params: SafeSpawnParams): Promise<SpawnResult> {
exitCode: code ?? -1,
summary: lastStdout,
error: lastStderr,
stderr: stderr.trim(),
stderr: stderrLines.join("\n"),
});
});
});