From aee63a2eef41b9b74034d515c01f9584788378ef Mon Sep 17 00:00:00 2001 From: Alex Southwell <4596216+saphid@users.noreply.github.com> Date: Tue, 3 Nov 2026 14:16:55 +1100 Subject: [PATCH] fix(server): review guides no longer fail on the repository's checkout hooks Co-Authored-By: Claude Opus 5.5 --- .../PullRequestReviewGuideService.test.ts | 12 ++++++++---- .../src/pullRequest/PullRequestReviewGuideService.ts | 12 +++++++++++- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/apps/server/src/pullRequest/PullRequestReviewGuideService.test.ts b/apps/server/src/pullRequest/PullRequestReviewGuideService.test.ts index 4f567142fbed5..3ee929f923a57 100644 --- a/apps/server/src/pullRequest/PullRequestReviewGuideService.test.ts +++ b/apps/server/src/pullRequest/PullRequestReviewGuideService.test.ts @@ -467,7 +467,7 @@ it.layer(layerBase, { excludeTestServices: true })("PullRequestReviewGuideServic ), ); - it.effect("keeps excerpts of source lines a configured diff driver would convert away", () => + it.effect("keeps excerpts despite the checkout's diff driver and a failing hook", () => Effect.scoped( Effect.gen(function* () { const repositories = yield* makeRepositories; @@ -477,6 +477,9 @@ it.layer(layerBase, { excludeTestServices: true })("PullRequestReviewGuideServic "feature.txt diff=blank\n", ); yield* git(repositories.workspace, ["config", "diff.blank.textconv", "true"]); + const hook = `${repositories.workspace}/.git/hooks/post-checkout`; + yield* fs.writeFileString(hook, "#!/bin/sh\nexit 1\n"); + yield* fs.chmod(hook, 0o755); const stored = yield* Deferred.make(); const context = yield* Layer.build( makeLayer({ @@ -502,9 +505,10 @@ it.layer(layerBase, { excludeTestServices: true })("PullRequestReviewGuideServic context, PullRequestReviewGuideService.PullRequestReviewGuideService, ); - yield* service.generate(reference); - yield* Deferred.await(stored); - const result = yield* service.get(reference); + const runs = yield* watchRuns; + yield* runs.generate(service, reference); + const result = yield* runs.settled(service, reference); + assert.notStrictEqual(result.run?._tag, "Failed", JSON.stringify(result.run)); assert.deepStrictEqual(result.guide?.stops[0]?.excerpts, [ { path: "feature.txt", side: "new", start: 1, end: 3, caption: "" }, ]); diff --git a/apps/server/src/pullRequest/PullRequestReviewGuideService.ts b/apps/server/src/pullRequest/PullRequestReviewGuideService.ts index a7618a23d27ae..8994837fcdd80 100644 --- a/apps/server/src/pullRequest/PullRequestReviewGuideService.ts +++ b/apps/server/src/pullRequest/PullRequestReviewGuideService.ts @@ -305,7 +305,17 @@ const make = Effect.gen(function* () { yield* git.execute({ operation: "PullRequestReviewGuideService.addWorktree", cwd: workspaceRoot, - args: ["worktree", "add", "--detach", "--quiet", path, resolvedHead.commitSha], + // Scratch checkout for reading the change: repository hooks (installs, LFS) only slow or fail it. + args: [ + "-c", + "core.hooksPath=/dev/null", + "worktree", + "add", + "--detach", + "--quiet", + path, + resolvedHead.commitSha, + ], timeoutMs: 5 * 60_000, }); yield* Effect.addFinalizer(() =>