Skip to content
Source
Sign inSign up
Open History to see the last commit

pullRequestSyncKey.ts

40 lines1.6 KB

1import type { PullRequestRef, RepositoryIdentity, ThreadPullRequestKey } from "@t3tools/contracts";
2import { sourceControlDefinitions } from "../sourceControl/sourceControlDefinitions.ts";
3import { normalizeThreadPullRequestKey } from "../sourceControl/threadPullRequests.ts";
4​
5export function pullRequestSyncKey(
6 reference: PullRequestRef,
7 identity?: RepositoryIdentity | null,
8): ThreadPullRequestKey | null {
9 const host = identity
10 ? sourceControlDefinitions.changeRequestHost(identity, identity.provider)
11 : undefined;
12 // A host whose tools select a repository by something other than its path (Azure DevOps takes
13 // the bare name) can only key such a reference through the project's own repository.
14 const definition = identity?.provider
15 ? sourceControlDefinitions.find(identity.provider)
16 : undefined;
17 if (identity && definition?.repositorySelector && !reference.repository.includes("/")) {
18 if (
19 reference.repository.toLowerCase() !==
20 definition.repositorySelector(identity)?.toLowerCase() ||
21 (reference.host !== undefined && reference.host.toLowerCase() !== host)
22 )
23 return null;
24 const [projectHost, ...repository] = identity.canonicalKey.split("/");
25 if (!projectHost || repository.length === 0) return null;
26 return normalizeThreadPullRequestKey({
27 host: projectHost,
28 repository: repository.join("/"),
29 number: reference.number,
30 });
31 }
32 const resolvedHost = reference.host ?? host;
33 return resolvedHost === undefined
34 ? null
35 : normalizeThreadPullRequestKey({
36 host: resolvedHost,
37 repository: reference.repository,
38 number: reference.number,
39 });