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", () => {...@@ -91,4 +91,33 @@ describe("detectSourceControlProviderFromRemoteUrl", () => {
91 baseUrl: "https://self-hosted.example.test:8443",91 baseUrl: "https://self-hosted.example.test:8443",
92 });92 });
93 });93 });
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 });
94});123});
packages/shared/src/sourceControl.ts+7-3
...@@ -167,12 +167,16 @@ function toBaseUrl(host: string): string {...@@ -167,12 +167,16 @@ function toBaseUrl(host: string): string {
167 return `https://${host}`;167 return `https://${host}`;
168}168}
169169
170function hasDnsLabel(host: string, label: string): boolean {
171 return host.split(".").includes(label);
172}
173
170function isGitHubHost(host: string): boolean {174function isGitHubHost(host: string): boolean {
171 return host === "github.com" || host.includes("github");175 return host === "github.com" || hasDnsLabel(host, "github");
172}176}
173177
174function isGitLabHost(host: string): boolean {178function isGitLabHost(host: string): boolean {
175 return host === "gitlab.com" || host.includes("gitlab");179 return host === "gitlab.com" || hasDnsLabel(host, "gitlab");
176}180}
177181
178function isAzureDevOpsHost(host: string): boolean {182function isAzureDevOpsHost(host: string): boolean {
...@@ -188,7 +192,7 @@ function isAzureDevOpsHost(host: string): boolean {...@@ -188,7 +192,7 @@ function isAzureDevOpsHost(host: string): boolean {
188}192}
189193
190function isBitbucketHost(host: string): boolean {194function isBitbucketHost(host: string): boolean {
191 return host === "bitbucket.org" || host.includes("bitbucket");195 return host === "bitbucket.org" || hasDnsLabel(host, "bitbucket");
192}196}
193197
194export function detectSourceControlProviderFromRemoteUrl(198export function detectSourceControlProviderFromRemoteUrl(