authorgravatar for gbarros1095@gmail.comGuilherme Barros <gbarros1095@gmail.com> 2026-08-15 13:31:56+02:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-08-15 13:31:56+02:00
log178da6bc3210b82c4a83f33c8b149f623a3375e1
tree72825d30e530ef7f1d507db74b4aa129a0d66fa0
parentddee418a8d6d3e242ca26a8053a886ecc3b56b53
signature Signed by PGP key B5690EEEBB952194

fix(shared): match source-control providers by DNS label (#6175)


2 files changed, 36 insertions(+), 3 deletions(-)

packages/shared/src/sourceControl.test.ts+29
......@@ -91,4 +91,33 @@ describe("detectSourceControlProviderFromRemoteUrl", () => {
9191 baseUrl: "https://self-hosted.example.test:8443",
9292 });
9393 });
94
95 it("matches self-hosted providers by complete DNS labels", () => {
96 expect(
97 detectSourceControlProviderFromRemoteUrl("https://github.example.com/owner/repo.git")?.kind,
98 ).toBe("github");
99 expect(
100 detectSourceControlProviderFromRemoteUrl("https://gitlab.example.com/group/repo.git")?.kind,
101 ).toBe("gitlab");
102 expect(
103 detectSourceControlProviderFromRemoteUrl("https://bitbucket.example.com/workspace/repo.git")
104 ?.kind,
105 ).toBe("bitbucket");
106 });
107
108 it("does not match provider names embedded in unrelated DNS labels", () => {
109 expect(
110 detectSourceControlProviderFromRemoteUrl("https://notgithub.example.com/owner/repo.git")
111 ?.kind,
112 ).toBe("unknown");
113 expect(
114 detectSourceControlProviderFromRemoteUrl("https://notgitlab.example.com/group/repo.git")
115 ?.kind,
116 ).toBe("unknown");
117 expect(
118 detectSourceControlProviderFromRemoteUrl(
119 "https://notbitbucket.example.com/workspace/repo.git",
120 )?.kind,
121 ).toBe("unknown");
122 });
94123});
packages/shared/src/sourceControl.ts+7-3
......@@ -167,12 +167,16 @@ function toBaseUrl(host: string): string {
167167 return `https://${host}`;
168168}
169169
170function hasDnsLabel(host: string, label: string): boolean {
171 return host.split(".").includes(label);
172}
173
170174function isGitHubHost(host: string): boolean {
171 return host === "github.com" || host.includes("github");
175 return host === "github.com" || hasDnsLabel(host, "github");
172176}
173177
174178function isGitLabHost(host: string): boolean {
175 return host === "gitlab.com" || host.includes("gitlab");
179 return host === "gitlab.com" || hasDnsLabel(host, "gitlab");
176180}
177181
178182function isAzureDevOpsHost(host: string): boolean {
......@@ -188,7 +192,7 @@ function isAzureDevOpsHost(host: string): boolean {
188192}
189193
190194function isBitbucketHost(host: string): boolean {
191 return host === "bitbucket.org" || host.includes("bitbucket");
195 return host === "bitbucket.org" || hasDnsLabel(host, "bitbucket");
192196}
193197
194198export function detectSourceControlProviderFromRemoteUrl(