1import {
2 pullRequestHostOf,
3 type PullRequestRef,
4 type RepositoryIdentity,
5 SourceControlProviderKind,
6 type ThreadPullRequestKey,
7} from "@t3tools/contracts";
8import { sourceControlRepositorySelector } from "@t3tools/shared/sourceControl";
9import { normalizeThreadPullRequestKey } from "@t3tools/shared/threadPullRequests";
10
11/** Convert checkout-scoped references to the host-level identity used by linked threads. */
12export function pullRequestSyncKey(
13 reference: PullRequestRef,
14 identity?: RepositoryIdentity | null,
15): ThreadPullRequestKey | null {
16 if (identity?.provider === "azure-devops" && !reference.repository.includes("/")) {
17 if (
18 reference.repository.toLowerCase() !==
19 sourceControlRepositorySelector(identity)?.toLowerCase() ||
20 (reference.host !== undefined &&
21 reference.host.toLowerCase() !==
22 pullRequestHostOf(identity, SourceControlProviderKind.make("azure-devops")))
23 )
24 return null;
25 const [host, ...repository] = identity.canonicalKey.split("/");
26 if (!host || repository.length === 0) return null;
27 return normalizeThreadPullRequestKey({
28 host,
29 repository: repository.join("/"),
30 number: reference.number,
31 });
32 }
33 const host =
34 reference.host ??
35 (identity
36 ? pullRequestHostOf(identity, identity.provider as SourceControlProviderKind)
37 : undefined);
38 return host === undefined
39 ? null
40 : normalizeThreadPullRequestKey({
41 host,
42 repository: reference.repository,
43 number: reference.number,
44 });
45}