Skip to content

Commit ca2a641

Browse files
fix(server): recognize target aliases across source control providers
1 parent cd4c592 commit ca2a641

2 files changed

Lines changed: 61 additions & 2 deletions

File tree

‎apps/server/src/git/GitManager.test.ts‎

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -742,6 +742,7 @@ function preparePullRequestThread(
742742
function makeManager(input?: {
743743
ghScenario?: FakeGhScenario;
744744
sourceControlProvider?: SourceControlProvider["Service"];
745+
sourceControlContext?: SourceControlProviderRegistry.SourceControlProviderHandle["context"];
745746
textGeneration?: Partial<FakeGitTextGeneration>;
746747
serverSettings?: Parameters<typeof ServerSettings.layerTest>[0];
747748
setupScriptRunner?: ProjectSetupScriptRunner.ProjectSetupScriptRunner["Service"];
@@ -840,7 +841,8 @@ function makeManager(input?: {
840841
SourceControlProviderRegistry.SourceControlProviderRegistry.of({
841842
resolveLink: (input) => provider.resolveLink?.(input),
842843
get: () => Effect.succeed(provider),
843-
resolveHandle: () => Effect.succeed({ provider, context: null }),
844+
resolveHandle: () =>
845+
Effect.succeed({ provider, context: input?.sourceControlContext ?? null }),
844846
resolve: () => Effect.succeed(provider),
845847
discover: Effect.succeed([]),
846848
}),
@@ -3587,6 +3589,63 @@ it.layer(layerGitManagerTest)("GitManager", (it) => {
35873589
}),
35883590
);
35893591

3592+
it.effect.each([false, true])(
3593+
"keeps a published non-GitHub base with a bound target context (fork: %s)",
3594+
(fork) =>
3595+
Effect.gen(function* () {
3596+
const repoDir = yield* makeTempDir("t3code-git-manager-");
3597+
yield* initRepo(repoDir);
3598+
const originDir = yield* createBareRemote();
3599+
const publishDir = yield* createBareRemote();
3600+
yield* runGit(repoDir, ["remote", "add", "origin", originDir]);
3601+
yield* runGit(repoDir, ["remote", "add", "publish", fork ? publishDir : originDir]);
3602+
yield* runGit(repoDir, ["push", "origin", "main"]);
3603+
yield* runGit(repoDir, ["checkout", "-b", "parent"]);
3604+
NodeFS.writeFileSync(NodePath.join(repoDir, "parent.txt"), "parent work\n");
3605+
yield* runGit(repoDir, ["add", "."]);
3606+
yield* runGit(repoDir, ["commit", "-m", "Parent commit"]);
3607+
yield* runGit(repoDir, ["push", "origin", "parent"]);
3608+
yield* runGit(repoDir, ["checkout", "-b", "child"]);
3609+
NodeFS.writeFileSync(NodePath.join(repoDir, "child.txt"), "child work\n");
3610+
yield* runGit(repoDir, ["add", "."]);
3611+
yield* runGit(repoDir, ["commit", "-m", "Child commit"]);
3612+
yield* runGit(repoDir, ["push", "-u", "publish", "child"]);
3613+
yield* runGit(repoDir, ["config", "branch.child.gh-merge-base", "parent"]);
3614+
// A narrow refspec keeps parent cached only under origin, even after status refreshes.
3615+
yield* runGit(repoDir, [
3616+
"config",
3617+
"remote.publish.fetch",
3618+
"+refs/heads/child:refs/remotes/publish/child",
3619+
]);
3620+
const { service } = createGitHubProviderWithFakeGh({
3621+
defaultBranch: "main",
3622+
prListSequence: ["[]", "[]"],
3623+
});
3624+
const kind = SourceControlProviderKind.make("gitcafe");
3625+
const generatedInputs: TextGeneration.PrContentGenerationInput[] = [];
3626+
const { manager } = yield* makeManager({
3627+
sourceControlProvider: { ...service, kind },
3628+
sourceControlContext: {
3629+
provider: { kind, name: "GitCafe", baseUrl: "https://git.cafe" },
3630+
remoteName: "origin",
3631+
remoteUrl: originDir,
3632+
},
3633+
textGeneration: {
3634+
generatePrContent: (input) => {
3635+
generatedInputs.push(input);
3636+
return Effect.succeed({ title: "Child PR", body: "Child body" });
3637+
},
3638+
},
3639+
});
3640+
const result = yield* runStackedAction(manager, { cwd: repoDir, action: "create_pr" });
3641+
3642+
expect(result.pr.baseBranch).toBe("parent");
3643+
expect(result.toast.description).not.toContain("unavailable");
3644+
expect(generatedInputs[0]!.commitSummary).toContain("Child commit");
3645+
expect(generatedInputs[0]!.commitSummary).not.toContain("Parent commit");
3646+
}),
3647+
);
3648+
35903649
it.effect.each([
35913650
{ remoteConfig: "branch.child.remote", baseRef: null, target: "origin" },
35923651
{ remoteConfig: "branch.child.pushRemote", baseRef: null, target: "origin" },

‎apps/server/src/git/GitManager.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2096,7 +2096,7 @@ export const make = Effect.gen(function* () {
20962096
if (target) {
20972097
targetRepository = `${target.host}/${target.owner}/${target.name}`.toLowerCase();
20982098
}
2099-
} else if (headContext.isCrossRepository && handle.context) {
2099+
} else if (handle.context) {
21002100
targetRepository = normalizeGitRemoteUrl(handle.context.remoteUrl);
21012101
}
21022102
if (targetRepository) {

0 commit comments

Comments
 (0)