Skip to content

Commit c9d10fb

Browse files
committed
[projects] make it fly with self-hosted gitlab
1 parent 76ad3ea commit c9d10fb

File tree

3 files changed

+39
-35
lines changed

3 files changed

+39
-35
lines changed

components/dashboard/src/projects/NewProject.tsx

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export default function NewProject() {
2626
const { teams } = useContext(TeamsContext);
2727
const { user, setUser } = useContext(UserContext);
2828

29-
const [provider, setProvider] = useState<string | undefined>();
29+
const [selectedProviderHost, setSelectedProviderHost] = useState<string | undefined>();
3030
const [reposInAccounts, setReposInAccounts] = useState<ProviderRepository[]>([]);
3131
const [repoSearchFilter, setRepoSearchFilter] = useState<string>("");
3232
const [selectedAccount, setSelectedAccount] = useState<string | undefined>(undefined);
@@ -42,15 +42,20 @@ export default function NewProject() {
4242
const [guessedConfigString, setGuessedConfigString] = useState<string | undefined>();
4343
const [sourceOfConfig, setSourceOfConfig] = useState<"repo" | "db" | undefined>();
4444

45+
const [authProviders, setAuthProviders] = useState<AuthProviderInfo[]>([]);
46+
4547
useEffect(() => {
46-
if (user && provider === undefined) {
48+
if (user && selectedProviderHost === undefined) {
4749
if (user.identities.find(i => i.authProviderId === "Public-GitLab")) {
48-
setProvider("gitlab.com");
50+
setSelectedProviderHost("gitlab.com");
4951
} else if (user.identities.find(i => i.authProviderId === "Public-GitHub")) {
50-
setProvider("github.com");
52+
setSelectedProviderHost("github.com");
5153
} else if (user.identities.find(i => i.authProviderId === "Public-Bitbucket")) {
52-
setProvider("bitbucket.org");
54+
setSelectedProviderHost("bitbucket.org");
5355
}
56+
(async () => {
57+
setAuthProviders(await getGitpodService().server.getAuthProviders());
58+
})();
5459
}
5560
}, [user]);
5661

@@ -138,14 +143,14 @@ export default function NewProject() {
138143
}, [selectedAccount]);
139144

140145
useEffect(() => {
141-
if (!provider || isBitbucket()) {
146+
if (!selectedProviderHost || isBitbucket()) {
142147
return;
143148
}
144149
(async () => {
145150
updateOrgsState();
146151
await updateReposInAccounts();
147152
})();
148-
}, [provider]);
153+
}, [selectedProviderHost]);
149154

150155
useEffect(() => {
151156
if (project && sourceOfConfig) {
@@ -158,17 +163,17 @@ export default function NewProject() {
158163
}
159164
}, [project, sourceOfConfig]);
160165

161-
const isGitHub = () => provider === "github.com";
162-
const isBitbucket = () => provider === "bitbucket.org";
166+
const isGitHub = () => selectedProviderHost === "github.com";
167+
const isBitbucket = () => selectedProviderHost === "bitbucket.org";
163168

164169
const updateReposInAccounts = async (installationId?: string) => {
165170
setLoaded(false);
166171
setReposInAccounts([]);
167-
if (!provider || isBitbucket()) {
172+
if (!selectedProviderHost || isBitbucket()) {
168173
return [];
169174
}
170175
try {
171-
const repos = await getGitpodService().server.getProviderRepositoriesForUser({ provider, hints: { installationId } });
176+
const repos = await getGitpodService().server.getProviderRepositoriesForUser({ provider: selectedProviderHost, hints: { installationId } });
172177
setReposInAccounts(repos);
173178
setLoaded(true);
174179
return repos;
@@ -183,9 +188,9 @@ export default function NewProject() {
183188
}
184189

185190
const updateOrgsState = async () => {
186-
if (provider && isGitHub()) {
191+
if (selectedProviderHost && isGitHub()) {
187192
try {
188-
const ghToken = await getToken(provider);
193+
const ghToken = await getToken(selectedProviderHost);
189194
setNoOrgs(ghToken?.scopes.includes("read:org") !== true);
190195
} catch {
191196
}
@@ -221,7 +226,7 @@ export default function NewProject() {
221226
}
222227

223228
const createProject = async (teamOrUser: Team | User, repo: ProviderRepository) => {
224-
if (!provider || isBitbucket()) {
229+
if (!selectedProviderHost || isBitbucket()) {
225230
return;
226231
}
227232
const repoSlug = repo.path || repo.name;
@@ -232,7 +237,7 @@ export default function NewProject() {
232237
slug: repoSlug,
233238
cloneUrl: repo.cloneUrl,
234239
account: repo.account,
235-
provider,
240+
provider: selectedProviderHost,
236241
...(User.is(teamOrUser) ? { userId: teamOrUser.id } : { teamId: teamOrUser.id }),
237242
appInstallationId: String(repo.installationId),
238243
});
@@ -295,7 +300,7 @@ export default function NewProject() {
295300
const showSearchInput = !!repoSearchFilter || filteredRepos.length > 0;
296301

297302
const renderRepos = () => (<>
298-
{!isBitbucket() && <p className="text-gray-500 text-center text-base">Select a Git repository on <strong>{provider}</strong>. (<a className="gp-link cursor-pointer" onClick={() => setShowGitProviders(true)}>change</a>)</p>}
303+
{!isBitbucket() && <p className="text-gray-500 text-center text-base">Select a Git repository on <strong>{selectedProviderHost}</strong>. (<a className="gp-link cursor-pointer" onClick={() => setShowGitProviders(true)}>change</a>)</p>}
299304
<div className={`mt-10 border rounded-xl border-gray-100 dark:border-gray-800 flex-col`}>
300305
<div className="px-8 pt-8 flex flex-col space-y-2" data-analytics='{"label":"Identity"}'>
301306
<ContextMenu classes="w-full left-0 cursor-pointer" menuEntries={getDropDownEntries(accounts)}>
@@ -392,15 +397,15 @@ export default function NewProject() {
392397
setUser(await getGitpodService().server.getLoggedInUser());
393398
}
394399
setShowGitProviders(false);
395-
setProvider(host);
400+
setSelectedProviderHost(host);
396401
}
397402

398403
if (!loaded && !isBitbucket()) {
399404
return renderLoadingState();
400405
}
401406

402407
if (showGitProviders || isBitbucket()) {
403-
return (<GitProviders onHostSelected={onGitProviderSeleted} />);
408+
return (<GitProviders onHostSelected={onGitProviderSeleted} authProviders={authProviders} />);
404409
}
405410

406411
return renderRepos();
@@ -513,18 +518,11 @@ export default function NewProject() {
513518
}
514519

515520
function GitProviders(props: {
521+
authProviders: AuthProviderInfo[],
516522
onHostSelected: (host: string, updateUser?: boolean) => void
517523
}) {
518-
const [authProviders, setAuthProviders] = useState<AuthProviderInfo[]>([]);
519524
const [ errorMessage, setErrorMessage ] = useState<string | undefined>(undefined);
520525

521-
useEffect(() => {
522-
(async () => {
523-
const providers = await getGitpodService().server.getAuthProviders();
524-
setAuthProviders(providers.filter(p => ["github.com", "gitlab.com"].includes(p.host)));
525-
})();
526-
}, []);
527-
528526
const selectProvider = async (ap: AuthProviderInfo) => {
529527
setErrorMessage(undefined);
530528

@@ -554,14 +552,17 @@ function GitProviders(props: {
554552
});
555553
}
556554

555+
// for now we exclude bitbucket.org and GitHub Enterprise
556+
const filteredProviders = () => props.authProviders.filter(p => p.host === "github.com" || p.authProviderType === "GitLab");
557+
557558
return (
558559
<div className="mt-8 border rounded-t-xl border-gray-100 dark:border-gray-800 flex-col">
559560
<div className="p-6 p-b-0">
560561
<div className="text-center text-gray-500">
561562
Select a Git provider first and continue with your repositories.
562563
</div>
563564
<div className="mt-6 flex flex-col space-y-3 items-center pb-8">
564-
{authProviders.map(ap => {
565+
{filteredProviders().map(ap => {
565566
return (
566567
<button key={"button" + ap.host} className="btn-login flex-none w-56 h-10 p-0 inline-flex" onClick={() => selectProvider(ap)}>
567568
{iconForAuthProvider(ap.authProviderType)}

components/server/ee/src/gitlab/gitlab-app-support.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* See License.enterprise.txt in the project root folder.
55
*/
66

7-
import { ProviderRepository, User } from "@gitpod/gitpod-protocol";
7+
import { AuthProviderInfo, ProviderRepository, User } from "@gitpod/gitpod-protocol";
88
import { inject, injectable } from "inversify";
99
import { TokenProvider } from "../../../src/user/token-provider";
1010
import { UserDB } from "@gitpod/gitpod-db/lib";
@@ -16,15 +16,15 @@ export class GitLabAppSupport {
1616
@inject(UserDB) protected readonly userDB: UserDB;
1717
@inject(TokenProvider) protected readonly tokenProvider: TokenProvider;
1818

19-
async getProviderRepositoriesForUser(params: { user: User, provider: string, hints?: object }): Promise<ProviderRepository[]> {
20-
const token = await this.tokenProvider.getTokenForHost(params.user, "gitlab.com");
19+
async getProviderRepositoriesForUser(params: { user: User, provider: AuthProviderInfo }): Promise<ProviderRepository[]> {
20+
const token = await this.tokenProvider.getTokenForHost(params.user, params.provider.host);
2121
const oauthToken = token.value;
22-
const api = new Gitlab({ oauthToken });
22+
const api = new Gitlab({ oauthToken, host: `https://${params.provider.host}` });
2323

2424
const result: ProviderRepository[] = [];
2525
const ownersRepos: ProviderRepository[] = [];
2626

27-
const identity = params.user.identities.find(i => i.authProviderId === "Public-GitLab");
27+
const identity = params.user.identities.find(i => i.authProviderId === params.provider.authProviderId);
2828
if (!identity) {
2929
return result;
3030
}

components/server/ee/src/workspace/gitpod-server-impl.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1423,10 +1423,13 @@ export class GitpodServerEEImpl extends GitpodServerImpl {
14231423
const user = this.checkAndBlockUser("getProviderRepositoriesForUser");
14241424

14251425
const repositories: ProviderRepository[] = [];
1426-
if (params.provider === "github.com") {
1426+
const providerHost = params.provider;
1427+
const provider = (await this.getAuthProviders(ctx)).find(ap => ap.host === providerHost);
1428+
1429+
if (providerHost === "github.com") {
14271430
repositories.push(...(await this.githubAppSupport.getProviderRepositoriesForUser({ user, ...params })));
1428-
} else if (params.provider === "gitlab.com") {
1429-
repositories.push(...(await this.gitLabAppSupport.getProviderRepositoriesForUser({ user, ...params })));
1431+
} else if (provider?.authProviderType === "GitLab") {
1432+
repositories.push(...(await this.gitLabAppSupport.getProviderRepositoriesForUser({ user, provider })));
14301433
} else {
14311434
log.info({ userId: user.id }, `Unsupported provider: "${params.provider}"`, { params });
14321435
}

0 commit comments

Comments
 (0)