Skip to content

Commit bdc0108

Browse files
fix(server): gh default remote lookup ignores an inherited GIT_DIR
The gh-resolved config query ran with only the bare-repository env, so a GIT_DIR inherited by the server pointed it at another checkout and a fork resolved to its parent. It now uses the same sanitized git env as the remote listing. Fixes #35744 Co-Authored-By: Claude Opus 5.5 <[email protected]>
1 parent 919763c commit bdc0108

2 files changed

Lines changed: 6 additions & 13 deletions

File tree

‎apps/server/src/project/RepositoryIdentityResolver.test.ts‎

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { expect, it } from "@effect/vitest";
55
import * as Effect from "effect/Effect";
66
import * as FileSystem from "effect/FileSystem";
77
import * as Path from "effect/Path";
8+
import { vi } from "vite-plus/test";
89

910
import * as ProcessRunner from "../processRunner.ts";
1011
import * as RepositoryIdentityResolver from "./RepositoryIdentityResolver.ts";
@@ -358,17 +359,8 @@ it.layer(NodeServices.layer)("RepositoryIdentityResolverLive", (it) => {
358359
yield* git(other, ["init"]);
359360
yield* git(other, ["config", "remote.upstream.gh-resolved", "base"]);
360361

361-
const previousGitDir = process.env.GIT_DIR;
362-
yield* Effect.acquireRelease(
363-
Effect.sync(() => {
364-
process.env.GIT_DIR = path.join(other, ".git");
365-
}),
366-
() =>
367-
Effect.sync(() => {
368-
if (previousGitDir === undefined) delete process.env.GIT_DIR;
369-
else process.env.GIT_DIR = previousGitDir;
370-
}),
371-
);
362+
vi.stubEnv("GIT_DIR", path.join(other, ".git"));
363+
yield* Effect.addFinalizer(() => Effect.sync(() => vi.unstubAllEnvs()));
372364

373365
const resolver = yield* RepositoryIdentityResolver.RepositoryIdentityResolver;
374366
const identity = yield* resolver.resolve(cwd);

‎apps/server/src/project/RepositoryIdentityResolver.ts‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,11 +242,12 @@ const resolveRepositoryIdentityFromCacheKey = Effect.fn(
242242
cacheKey: RepositoryIdentityCacheKey,
243243
): Effect.fn.Return<RepositoryIdentity | null, never, ProcessRunner.ProcessRunner> {
244244
const processRunner = yield* ProcessRunner.ProcessRunner;
245+
const env = gitEnv(yield* HostProcess.Platform);
245246
const remoteResult = yield* processRunner
246247
.run({
247248
command: "git",
248249
args: ["-C", cacheKey.rootPath, ...(cacheKey.isBare ? ["--git-dir=."] : []), "remote", "-v"],
249-
env: gitEnv(yield* HostProcess.Platform),
250+
env,
250251
timeoutBehavior: "timedOutResult",
251252
})
252253
.pipe(Effect.option);
@@ -265,7 +266,7 @@ const resolveRepositoryIdentityFromCacheKey = Effect.fn(
265266
"--get-regexp",
266267
"^remote\\..*\\.gh-resolved$",
267268
],
268-
env: explicitBareRepositoryEnv(process.env, yield* HostProcess.Platform),
269+
env,
269270
timeoutBehavior: "timedOutResult",
270271
})
271272
.pipe(Effect.option);

0 commit comments

Comments
 (0)