From c5ab0963c989e6c076be5c01858c55de9161761f Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Thu, 23 Apr 2026 16:33:29 +0100 Subject: [PATCH] fix: tolerate post-update json in install smoke --- scripts/docker/install-sh-smoke/run.sh | 36 ++++++++++++++++++++- test/scripts/test-install-sh-docker.test.ts | 2 ++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/scripts/docker/install-sh-smoke/run.sh b/scripts/docker/install-sh-smoke/run.sh index 3205a1b4713..f7ecfb1004c 100755 --- a/scripts/docker/install-sh-smoke/run.sh +++ b/scripts/docker/install-sh-smoke/run.sh @@ -255,7 +255,41 @@ run_update_smoke() { UPDATE_BASELINE_VERSION="$UPDATE_BASELINE_VERSION" \ UPDATE_TAG_URL="$UPDATE_TAG_URL" \ node - <<'NODE' -const payload = JSON.parse(process.env.UPDATE_JSON || "{}"); +function parseFirstJsonObject(raw) { + const start = raw.indexOf("{"); + if (start < 0) { + throw new Error("missing update JSON object"); + } + let depth = 0; + let inString = false; + let escaped = false; + for (let index = start; index < raw.length; index += 1) { + const char = raw[index]; + if (inString) { + if (escaped) { + escaped = false; + } else if (char === "\\") { + escaped = true; + } else if (char === '"') { + inString = false; + } + continue; + } + if (char === '"') { + inString = true; + } else if (char === "{") { + depth += 1; + } else if (char === "}") { + depth -= 1; + if (depth === 0) { + return JSON.parse(raw.slice(start, index + 1)); + } + } + } + throw new Error("unterminated update JSON object"); +} + +const payload = parseFirstJsonObject(process.env.UPDATE_JSON || "{}"); const expectedVersion = String(process.env.UPDATE_EXPECT_VERSION || ""); const baselineVersion = String(process.env.UPDATE_BASELINE_VERSION || ""); const expectedUrl = String(process.env.UPDATE_TAG_URL || ""); diff --git a/test/scripts/test-install-sh-docker.test.ts b/test/scripts/test-install-sh-docker.test.ts index 65b90c5c862..df62ec446cc 100644 --- a/test/scripts/test-install-sh-docker.test.ts +++ b/test/scripts/test-install-sh-docker.test.ts @@ -79,6 +79,8 @@ describe("install-sh smoke runner", () => { expect(script).toContain("print_install_audit"); expect(script).toContain('install -g "$@"'); expect(script).toContain("openclaw update --tag"); + expect(script).toContain("parseFirstJsonObject"); + expect(script).toContain("unterminated update JSON object"); }); it("covers plain npm global installs and npm-driven updates", () => {