From edc503a7a8ea5284a2711981c1a10a6b9999f5e4 Mon Sep 17 00:00:00 2001 From: Wout Stiens <71498452+StiensWout@users.noreply.github.com> Date: Thu, 30 Jul 2026 18:17:44 +0200 Subject: [PATCH] fix(server): restore PR detection without HOME (#4985) --- apps/server/src/os-jank.test.ts | 40 +++++++++++++++++++++++++++++++++ apps/server/src/os-jank.ts | 19 ++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 apps/server/src/os-jank.test.ts diff --git a/apps/server/src/os-jank.test.ts b/apps/server/src/os-jank.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..a157efb665fa17791f25e2fe91da38a418625dbc --- /dev/null +++ b/apps/server/src/os-jank.test.ts @@ -0,0 +1,40 @@ +import * as NodeOS from "node:os"; +import { assert, it } from "vite-plus/test"; + +import { hydratePosixHome } from "./os-jank.ts"; + +it("hydrates HOME for minimal service environments from the user account", () => { + const env: NodeJS.ProcessEnv = {}; + + hydratePosixHome(env); + + assert.equal(env.HOME, NodeOS.userInfo().homedir); +}); + +it("hydrates HOME independently of a blank process HOME", () => { + const originalHome = process.env.HOME; + const env: NodeJS.ProcessEnv = { HOME: " " }; + + try { + process.env.HOME = " "; + hydratePosixHome(env); + } finally { + if (originalHome === undefined) { + delete process.env.HOME; + } else { + process.env.HOME = originalHome; + } + } + + assert.equal(env.HOME, NodeOS.userInfo().homedir); +}); + +it("preserves an explicitly configured HOME", () => { + const env: NodeJS.ProcessEnv = { HOME: "/custom/home" }; + + hydratePosixHome(env, () => { + throw new Error("HOME lookup should not run"); + }); + + assert.equal(env.HOME, "/custom/home"); +}); diff --git a/apps/server/src/os-jank.ts b/apps/server/src/os-jank.ts index bc72758bc718faaa6f1dac3c0648a0a5157d76a4..18ddbc66c0c852652c96a4def292b0f6b727c54f 100644 --- a/apps/server/src/os-jank.ts +++ b/apps/server/src/os-jank.ts @@ -36,6 +36,18 @@ function hydratePosixPath(env: NodeJS.ProcessEnv, platform: NodeJS.Platform): vo } } +export function hydratePosixHome( + env: NodeJS.ProcessEnv, + resolveHomeDir = () => NodeOS.userInfo().homedir, +): void { + if ((env.HOME?.trim() ?? "").length > 0) return; + + const homeDir = resolveHomeDir(); + if (homeDir.length > 0) { + env.HOME = homeDir; + } +} + export const fixPath = Effect.fn("fixPath")(function* (): Effect.fn.Return< void, never, @@ -63,6 +75,13 @@ export const fixPath = Effect.fn("fixPath")(function* (): Effect.fn.Return< if (platform !== "darwin" && platform !== "linux") return; + yield* Effect.sync(() => hydratePosixHome(env)).pipe( + Effect.catchDefect((defect) => + Effect.sync(() => { + logPathHydrationWarning("Failed to hydrate HOME from the user account.", defect); + }), + ), + ); yield* Effect.sync(() => hydratePosixPath(env, platform)).pipe( Effect.catchDefect((defect) => Effect.sync(() => { -- 2.54.0