History

fix(source-control): handle self-hosted GitLab, multi-account GitHub auth & azure devops web url (#2480)

Guilherme Vieira committed 5 months ago

Commit 49c1b641 parent dfdb5a414 files · +757 −48Browse files

Showing the changes to apps/server/src/sourceControl/GitLabSourceControlProvider.ts (1 of 14 files). Show all

Unified · Split

apps/server/src/sourceControl/GitLabSourceControlProvider.ts+34−10
@@ -6,6 +6,7 @@ import { SourceControlProviderError, type ChangeRequest } from "@t3tools/contrac · 5 unmodified lines
66 import * as GitLabCli from "./GitLabCli.ts";
77 import * as SourceControlProvider from "./SourceControlProvider.ts";
88 import * as SourceControlProviderDiscovery from "./SourceControlProviderDiscovery.ts";
9+import { findAuthenticatedGitLabHost, parseGitLabAuthStatusHosts } from "./gitLabAuthStatus.ts";
910
1011 function providerError(
1112 operation: string,
@@ -43,12 +44,19 @@ function toChangeRequest(summary: GitLabCli.GitLabMergeRequestSummary): ChangeRe · 31 unmodified lines
4344
4445 function parseGitLabAuth(input: SourceControlProviderDiscovery.SourceControlAuthProbeInput) {
4546 const output = SourceControlProviderDiscovery.combinedAuthOutput(input);
46− const account = SourceControlProviderDiscovery.matchFirst(output, [
47− /Logged in to .* as\s+([^\s(]+)/iu,
48− /Logged in to .* account\s+([^\s(]+)/iu,
49− /account:\s*([^\s(]+)/iu,
50− ]);
51− const host = SourceControlProviderDiscovery.parseCliHost(output);
47+ const authenticatedHost = findAuthenticatedGitLabHost(parseGitLabAuthStatusHosts(output));
48+ const account =
49+ authenticatedHost?.account ??
50+ SourceControlProviderDiscovery.matchFirst(output, [
51+ /Logged in to .* as\s+([^\s(]+)/iu,
52+ /Logged in to .* account\s+([^\s(]+)/iu,
53+ /account:\s*([^\s(]+)/iu,
54+ ]);
55+ const host = authenticatedHost?.host ?? SourceControlProviderDiscovery.parseCliHost(output);
56+
57+ if (account) {
58+ return SourceControlProviderDiscovery.providerAuth({ status: "authenticated", account, host });
59+ }
5260
5361 if (input.exitCode !== 0) {
5462 return SourceControlProviderDiscovery.providerAuth({
@@ -60,10 +68,6 @@ function parseGitLabAuth(input: SourceControlProviderDiscovery.SourceControlAuth · 5 unmodified lines
6068 });
6169 }
6270
63− if (account) {
64− return SourceControlProviderDiscovery.providerAuth({ status: "authenticated", account, host });
65− }
66−
6771 return SourceControlProviderDiscovery.providerAuth({
6872 status: "unknown",
6973 host,
@@ -73,6 +77,25 @@ function parseGitLabAuth(input: SourceControlProviderDiscovery.SourceControlAuth · 3 unmodified lines
7377 });
7478 }
7579
80+function refineUnknownGitLabRemote(
81+ input: SourceControlProviderDiscovery.SourceControlUnknownRemoteRefinementInput,
82+) {
83+ const host = input.context.provider.name.toLowerCase();
84+ const authenticated = parseGitLabAuthStatusHosts(
85+ SourceControlProviderDiscovery.combinedAuthOutput(input.auth),
86+ ).some((entry) => entry.account !== null && entry.host === host);
87+
88+ if (!authenticated) {
89+ return null;
90+ }
91+
92+ return {
93+ kind: "gitlab",
94+ name: "GitLab Self-Hosted",
95+ baseUrl: input.context.provider.baseUrl,
96+ } as const;
97+}
98+
7699 export const discovery = {
77100 type: "cli",
78101 kind: "gitlab",
@@ -81,6 +104,7 @@ export const discovery = { · 2 unmodified lines
81104 versionArgs: ["--version"],
82105 authArgs: ["auth", "status"],
83106 parseAuth: parseGitLabAuth,
107+ refineUnknownRemote: refineUnknownGitLabRemote,
84108 installHint:
85109 "Install the GitLab command-line tool (`glab`) from https://gitlab.com/gitlab-org/cli or your package manager (for example `brew install glab`).",
86110 } satisfies SourceControlProviderDiscovery.SourceControlCliDiscoverySpec;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t