diff --git a/src/cli/update-cli.test.ts b/src/cli/update-cli.test.ts index 8a212eb5311c..55d1f58f2f8d 100644 --- a/src/cli/update-cli.test.ts +++ b/src/cli/update-cli.test.ts @@ -2912,6 +2912,40 @@ describe("update-cli", () => { expect(logs.join("\n")).not.toContain("Gateway: restarted and verified."); }); + it("fails managed git restart when the stopped service cannot be restarted", async () => { + const serviceEntrypoint = path.join(process.cwd(), "dist", "index.js"); + serviceReadCommand.mockResolvedValue({ + programArguments: ["node", serviceEntrypoint, "gateway", "run"], + environment: { + OPENCLAW_SERVICE_MARKER: "openclaw", + OPENCLAW_SERVICE_KIND: "gateway", + }, + }); + serviceLoaded.mockResolvedValue(false); + serviceLoaded.mockResolvedValueOnce(true); + serviceReadRuntime.mockResolvedValue({ + status: "stopped", + pid: null, + state: "stopped", + }); + serviceReadRuntime.mockResolvedValueOnce({ + status: "running", + pid: 4242, + state: "running", + }); + runRestartScript.mockRejectedValueOnce(new Error("restart unavailable")); + mockGitUpdateAfterMutation(); + + await updateCommand({ yes: true }); + + const logs = vi.mocked(defaultRuntime.log).mock.calls.map((call) => String(call[0])); + expect(serviceStop).toHaveBeenCalledTimes(1); + expect(runRestartScript).toHaveBeenCalledTimes(1); + expect(defaultRuntime.exit).toHaveBeenCalledWith(1); + expect(logs.join("\n")).toContain("Gateway: restart failed: Error: restart unavailable"); + expect(logs.join("\n")).not.toContain("Gateway: restarted and verified."); + }); + it("stops a managed gateway rooted at the git checkout when switching package installs to dev", async () => { const packageRoot = createCaseDir("openclaw-update-package-root"); const gitRoot = await createTrackedTempDir("openclaw-update-git-service-root-"); diff --git a/src/cli/update-cli/update-command.ts b/src/cli/update-cli/update-command.ts index 2a7573811aa6..04dbd7580ee1 100644 --- a/src/cli/update-cli/update-command.ts +++ b/src/cli/update-cli/update-command.ts @@ -2315,7 +2315,10 @@ async function maybeRestartService(params: { ), ); } - if (isPackageManagerUpdateMode(params.result.mode)) { + if ( + isPackageManagerUpdateMode(params.result.mode) || + params.requireRunningServiceAfterRestart + ) { return false; } }