From 08307ea0f3aec7f6a3d749ba2b8dc29b93a1c7b2 Mon Sep 17 00:00:00 2001 From: Guillermo Casanova Date: Mon, 14 Sep 2026 15:23:16 -0300 Subject: [PATCH] fix(server): keep worktree creation working when git config is locked --- apps/server/src/vcs/GitVcsDriverCore.test.ts | 38 ++++++++++++++++++++ apps/server/src/vcs/GitVcsDriverCore.ts | 9 ++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/apps/server/src/vcs/GitVcsDriverCore.test.ts b/apps/server/src/vcs/GitVcsDriverCore.test.ts index 85c4d1a59d1d..bfda6a55349b 100644 --- a/apps/server/src/vcs/GitVcsDriverCore.test.ts +++ b/apps/server/src/vcs/GitVcsDriverCore.test.ts @@ -2560,6 +2560,44 @@ it.layer(TestLayer)("GitVcsDriver core integration", (it) => { }), ); + it.effect("still creates the worktree when the base-ref config is locked", () => + Effect.gen(function* () { + const cwd = yield* makeTmpDir(); + const { initialBranch } = yield* initRepoWithCommit(cwd); + const pathService = yield* Path.Path; + const fileSystem = yield* FileSystem.FileSystem; + const worktreePath = pathService.join(yield* makeTmpDir("git-worktrees-"), "locked-config"); + yield* writeTextFile(cwd, ".git/config.lock", ""); + const driver = yield* GitVcsDriver.GitVcsDriver; + + const created = yield* driver.createWorktree({ + cwd, + path: worktreePath, + refName: initialBranch, + newRefName: "feature/locked-config", + baseRefName: initialBranch, + }); + + assert.deepEqual(created.worktree, { + path: worktreePath, + refName: "feature/locked-config", + }); + assert.equal( + yield* git(worktreePath, ["branch", "--show-current"]), + "feature/locked-config", + ); + assert.equal( + yield* fileSystem.readFileString(pathService.join(worktreePath, "README.md")), + "# test\n", + ); + assert.equal( + yield* driver.readConfigValue(worktreePath, "branch.feature/locked-config.gh-merge-base"), + null, + ); + assert.equal(yield* fileSystem.exists(pathService.join(cwd, ".git/config.lock")), true); + }), + ); + it.effect("reports checkout progress during parallel worktree creation", () => Effect.gen(function* () { const cwd = yield* makeTmpDir(); diff --git a/apps/server/src/vcs/GitVcsDriverCore.ts b/apps/server/src/vcs/GitVcsDriverCore.ts index 0dd73af687f9..1c20e20f97e8 100644 --- a/apps/server/src/vcs/GitVcsDriverCore.ts +++ b/apps/server/src/vcs/GitVcsDriverCore.ts @@ -3186,7 +3186,14 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function* "config", `branch.${input.newRefName}.gh-merge-base`, baseBranch, - ]); + ]).pipe( + Effect.catch((cause) => + Effect.logWarning("worktree base-ref configuration failed; using base-branch fallback", { + worktreePath, + cause, + }), + ), + ); } return {