diff --git a/.repos/alchemy-effect/packages/alchemy/src/Telemetry/Attributes.ts b/.repos/alchemy-effect/packages/alchemy/src/Telemetry/Attributes.ts index 3713e9b7464..c101cead79a 100644 --- a/.repos/alchemy-effect/packages/alchemy/src/Telemetry/Attributes.ts +++ b/.repos/alchemy-effect/packages/alchemy/src/Telemetry/Attributes.ts @@ -84,7 +84,7 @@ const getGitOriginUrl: Effect.Effect = execCapture( ); const getBranchName: Effect.Effect = execCapture( - "git rev-parse --abbrev-ref HEAD", + "git symbolic-ref --quiet --short HEAD", ); const getRuntime = (): { name: string; version: string } => { diff --git a/apps/server/src/vcs/GitVcsDriverCore.test.ts b/apps/server/src/vcs/GitVcsDriverCore.test.ts index c0e0f1876c4..b212e82d50e 100644 --- a/apps/server/src/vcs/GitVcsDriverCore.test.ts +++ b/apps/server/src/vcs/GitVcsDriverCore.test.ts @@ -155,6 +155,26 @@ it.layer(TestLayer)("GitVcsDriver core integration", (it) => { }), ); + it.effect("reports remote status for an unborn branch", () => + Effect.gen(function* () { + const cwd = yield* makeTmpDir(); + const driver = yield* GitVcsDriver.GitVcsDriver; + yield* driver.initRepo({ cwd }); + + const status = yield* driver.statusDetailsRemote(cwd); + + assert.equal(status.isRepo, true); + assert.equal( + status.branch, + yield* git(cwd, ["symbolic-ref", "--quiet", "--short", "HEAD"]), + ); + assert.equal(status.hasUpstream, false); + assert.equal(status.aheadCount, 0); + assert.equal(status.behindCount, 0); + assert.equal(status.aheadOfDefaultCount, 0); + }), + ); + it.effect("reports remote divergence without reading working-tree details", () => Effect.gen(function* () { const cwd = yield* makeTmpDir(); diff --git a/apps/server/src/vcs/GitVcsDriverCore.ts b/apps/server/src/vcs/GitVcsDriverCore.ts index 42fda3c80b2..8558a245615 100644 --- a/apps/server/src/vcs/GitVcsDriverCore.ts +++ b/apps/server/src/vcs/GitVcsDriverCore.ts @@ -1168,7 +1168,7 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function* const branchResult = yield* executeGit( "GitVcsDriver.statusDetailsRemote.branch", cwd, - ["rev-parse", "--abbrev-ref", "HEAD"], + ["symbolic-ref", "--quiet", "--short", "HEAD"], { allowNonZeroExit: true }, ).pipe(Effect.catchIf(isMissingGitCwdError, () => Effect.succeed(null))); @@ -1176,17 +1176,25 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function* return NON_REPOSITORY_REMOTE_STATUS_DETAILS; } if (branchResult.exitCode !== 0) { - const stderr = branchResult.stderr.trim(); - return yield* createGitCommandError( - "GitVcsDriver.statusDetailsRemote.branch", + const headResult = yield* executeGit( + "GitVcsDriver.statusDetailsRemote.head", cwd, - ["rev-parse", "--abbrev-ref", "HEAD"], - stderr || "git branch lookup failed", + ["rev-parse", "--verify", "--quiet", "HEAD"], + { allowNonZeroExit: true }, ); + if (headResult.exitCode !== 0) { + const stderr = branchResult.stderr.trim() || headResult.stderr.trim(); + return yield* createGitCommandError( + "GitVcsDriver.statusDetailsRemote.branch", + cwd, + ["symbolic-ref", "--quiet", "--short", "HEAD"], + stderr || "git branch lookup failed", + ); + } } const branchValue = branchResult.stdout.trim(); - const branch = branchValue.length > 0 && branchValue !== "HEAD" ? branchValue : null; + const branch = branchResult.exitCode === 0 && branchValue.length > 0 ? branchValue : null; const upstream = yield* resolveCurrentUpstream(cwd); const upstreamRef = upstream?.upstreamRef ?? null; let aheadCount = 0;