Skip to content

Commit 75b3b3c

Browse files
[codex] Make background VCS fetch non-interactive (pingdotgg#3133)
1 parent b489ea5 commit 75b3b3c

2 files changed

Lines changed: 38 additions & 20 deletions

File tree

apps/server/src/vcs/GitVcsDriverCore.test.ts

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ it.layer(TestLayer)("GitVcsDriver core integration", (it) => {
216216
}),
217217
);
218218

219-
it.effect("disables SSH askpass for background upstream status fetches", () =>
219+
it.effect("makes background upstream status fetches non-interactive", () =>
220220
Effect.gen(function* () {
221221
const cwd = yield* makeTmpDir();
222222
const tempDir = yield* makeTmpDir("git-vcs-driver-ssh-env-");
@@ -225,15 +225,26 @@ it.layer(TestLayer)("GitVcsDriver core integration", (it) => {
225225
const pathService = yield* Path.Path;
226226
const sshLogPath = pathService.join(tempDir, "ssh-env.txt");
227227
const sshWrapperPath = pathService.join(tempDir, "ssh-wrapper.sh");
228-
const previousGitSsh = process.env.GIT_SSH;
229-
const previousAskpassRequire = process.env.SSH_ASKPASS_REQUIRE;
230-
const previousAskpassLog = process.env.T3_TEST_SSH_ASKPASS_LOG;
228+
const envKeys = [
229+
"GCM_INTERACTIVE",
230+
"GIT_ASKPASS",
231+
"GIT_SSH",
232+
"GIT_TERMINAL_PROMPT",
233+
"SSH_ASKPASS",
234+
"SSH_ASKPASS_REQUIRE",
235+
"T3_TEST_SSH_ASKPASS_LOG",
236+
] as const;
237+
const previousEnv = new Map(envKeys.map((key) => [key, process.env[key]]));
231238

232239
yield* fileSystem.writeFileString(
233240
sshWrapperPath,
234241
[
235242
"#!/bin/sh",
236-
'printf "%s\\n" "${SSH_ASKPASS_REQUIRE:-}" > "$T3_TEST_SSH_ASKPASS_LOG"',
243+
'printf "GCM_INTERACTIVE=%s\\n" "${GCM_INTERACTIVE:-}" > "$T3_TEST_SSH_ASKPASS_LOG"',
244+
'printf "GIT_ASKPASS=%s\\n" "${GIT_ASKPASS:-}" >> "$T3_TEST_SSH_ASKPASS_LOG"',
245+
'printf "GIT_TERMINAL_PROMPT=%s\\n" "${GIT_TERMINAL_PROMPT:-}" >> "$T3_TEST_SSH_ASKPASS_LOG"',
246+
'printf "SSH_ASKPASS=%s\\n" "${SSH_ASKPASS:-}" >> "$T3_TEST_SSH_ASKPASS_LOG"',
247+
'printf "SSH_ASKPASS_REQUIRE=%s\\n" "${SSH_ASKPASS_REQUIRE:-}" >> "$T3_TEST_SSH_ASKPASS_LOG"',
237248
"exit 1",
238249
"",
239250
].join("\n"),
@@ -245,29 +256,32 @@ it.layer(TestLayer)("GitVcsDriver core integration", (it) => {
245256

246257
yield* Effect.gen(function* () {
247258
process.env.GIT_SSH = sshWrapperPath;
259+
process.env.GCM_INTERACTIVE = "always";
260+
process.env.GIT_ASKPASS = "git-askpass";
261+
process.env.GIT_TERMINAL_PROMPT = "1";
262+
process.env.SSH_ASKPASS = "ssh-askpass";
248263
process.env.SSH_ASKPASS_REQUIRE = "force";
249264
process.env.T3_TEST_SSH_ASKPASS_LOG = sshLogPath;
250265

251266
yield* (yield* GitVcsDriver.GitVcsDriver).statusDetails(cwd);
252267

253-
assert.equal((yield* fileSystem.readFileString(sshLogPath)).trim(), "never");
268+
assert.deepEqual((yield* fileSystem.readFileString(sshLogPath)).trim().split(/\r?\n/), [
269+
"GCM_INTERACTIVE=never",
270+
"GIT_ASKPASS=",
271+
"GIT_TERMINAL_PROMPT=0",
272+
"SSH_ASKPASS=",
273+
"SSH_ASKPASS_REQUIRE=never",
274+
]);
254275
}).pipe(
255276
Effect.ensuring(
256277
Effect.sync(() => {
257-
if (previousGitSsh === undefined) {
258-
delete process.env.GIT_SSH;
259-
} else {
260-
process.env.GIT_SSH = previousGitSsh;
261-
}
262-
if (previousAskpassRequire === undefined) {
263-
delete process.env.SSH_ASKPASS_REQUIRE;
264-
} else {
265-
process.env.SSH_ASKPASS_REQUIRE = previousAskpassRequire;
266-
}
267-
if (previousAskpassLog === undefined) {
268-
delete process.env.T3_TEST_SSH_ASKPASS_LOG;
269-
} else {
270-
process.env.T3_TEST_SSH_ASKPASS_LOG = previousAskpassLog;
278+
for (const key of envKeys) {
279+
const previous = previousEnv.get(key);
280+
if (previous === undefined) {
281+
delete process.env[key];
282+
} else {
283+
process.env[key] = previous;
284+
}
271285
}
272286
}),
273287
),

apps/server/src/vcs/GitVcsDriverCore.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ const STATUS_UPSTREAM_REFRESH_TIMEOUT = Duration.seconds(5);
5454
const STATUS_UPSTREAM_REFRESH_FAILURE_COOLDOWN = Duration.seconds(5);
5555
const STATUS_UPSTREAM_REFRESH_CACHE_CAPACITY = 2_048;
5656
const STATUS_UPSTREAM_REFRESH_ENV = Object.freeze({
57+
GCM_INTERACTIVE: "never",
58+
GIT_ASKPASS: "",
59+
GIT_TERMINAL_PROMPT: "0",
60+
SSH_ASKPASS: "",
5761
SSH_ASKPASS_REQUIRE: "never",
5862
} satisfies NodeJS.ProcessEnv);
5963
const DEFAULT_BASE_BRANCH_CANDIDATES = ["main", "master"] as const;

0 commit comments

Comments
 (0)