Skip to content

Commit b2fbf18

Browse files
committed
[protocol] Make ContextURL.parseToURL support the newly-accepted 'git@{host}:{user}/{repo}.git' format
Fixes #8097 Companion to #7951
1 parent 6e8e2a5 commit b2fbf18

File tree

2 files changed

+40
-22
lines changed

2 files changed

+40
-22
lines changed

components/gitpod-protocol/src/context-url.spec.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@ export class ContextUrlTest {
2424
expect(actual?.pathname).to.equal("/gitpod-io/gitpod-test-repo");
2525
}
2626

27+
@test public parseContextUrl_withEnvVar_sshUrl() {
28+
const actual = ContextURL.parseToURL("passedin=test%20value/[email protected]:gitpod-io/gitpod-test-repo.git");
29+
expect(actual?.host).to.equal("github.com");
30+
expect(actual?.pathname).to.equal("/gitpod-io/gitpod-test-repo.git");
31+
}
32+
2733
@test public parseContextUrl_withPrebuild() {
2834
const actual = ContextURL.parseToURL("prebuild/https://github.com/gitpod-io/gitpod-test-repo");
2935
expect(actual?.host).to.equal("github.com");
@@ -35,5 +41,10 @@ export class ContextUrlTest {
3541
expect(actual?.host).to.equal("github.com");
3642
expect(actual?.pathname).to.equal("/gitpod-io/gitpod-test-repo");
3743
}
44+
45+
@test public parseContextUrl_badUrl() {
46+
const actual = ContextURL.parseToURL("[Object object]");
47+
expect(actual).to.be.undefined;
48+
}
3849
}
3950
module.exports = new ContextUrlTest()

components/gitpod-protocol/src/context-url.ts

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -21,33 +21,40 @@ export namespace ContextURL {
2121
return undefined;
2222
}
2323

24-
const segments = contextUrl.split("/");
25-
if (segments.length === 1) {
26-
return new URL(segments[0]); // this might be something, we just try
27-
}
28-
29-
const segmentsToURL = (offset: number): URL => {
30-
let rest = segments.slice(offset).join("/");
31-
if (!rest.startsWith("http")) {
32-
rest = 'https://' + rest;
24+
try {
25+
const segments = contextUrl.split("/");
26+
if (segments.length === 1) {
27+
return new URL(segments[0]); // this might be something, we just try
3328
}
34-
return new URL(rest);
35-
};
3629

30+
const segmentsToURL = (offset: number): URL | undefined => {
31+
let rest = segments.slice(offset).join("/");
32+
if (/^git@[^:\/]+:/.test(rest)) {
33+
rest = rest.replace(/^git@([^:\/]+):/, 'https://$1/');
34+
}
35+
if (!rest.startsWith("http")) {
36+
rest = 'https://' + rest;
37+
}
38+
return new URL(rest);
39+
};
40+
41+
const firstSegment = segments[0];
42+
if (firstSegment === PREBUILD_PREFIX ||
43+
firstSegment === INCREMENTAL_PREBUILD_PREFIX ||
44+
firstSegment === IMAGEBUILD_PREFIX ||
45+
firstSegment.startsWith(REFERRER_PREFIX)) {
46+
return segmentsToURL(1);
47+
}
3748

38-
const firstSegment = segments[0];
39-
if (firstSegment === PREBUILD_PREFIX ||
40-
firstSegment === INCREMENTAL_PREBUILD_PREFIX ||
41-
firstSegment === IMAGEBUILD_PREFIX ||
42-
firstSegment.startsWith(REFERRER_PREFIX)) {
43-
return segmentsToURL(1);
44-
}
49+
// check for env vars
50+
if (firstSegment.indexOf("=") !== -1) {
51+
return segmentsToURL(1);
52+
}
4553

46-
// check for env vars
47-
if (firstSegment.indexOf("=") !== -1) {
48-
return segmentsToURL(1);
54+
return segmentsToURL(0);
55+
} catch (error) {
56+
console.error(error);
4957
}
5058

51-
return segmentsToURL(0);
5259
}
5360
}

0 commit comments

Comments
 (0)