Skip to content

Commit 5dc1f5d

Browse files
committed
Gets provider resource URL asyncronously
(#4142, #4143)
1 parent aa105d0 commit 5dc1f5d

File tree

5 files changed

+25
-28
lines changed

5 files changed

+25
-28
lines changed

src/env/node/git/localGitProvider.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -508,7 +508,7 @@ export class LocalGitProvider implements GitProvider, Disposable {
508508
case 'gitea':
509509
case 'gerrit':
510510
case 'google-source':
511-
url = remote.provider.url({ type: RemoteResourceType.Repo });
511+
url = await remote.provider.url({ type: RemoteResourceType.Repo });
512512
if (url == null) return ['private', remote];
513513

514514
break;

src/git/remotes/remoteProvider.ts

+11-14
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ export abstract class RemoteProvider<T extends ResourceDescriptor = ResourceDesc
100100
abstract get name(): string;
101101

102102
async copy(resource: RemoteResource | RemoteResource[]): Promise<void> {
103-
const urls = this.getUrlsFromResources(resource);
103+
const urls = await this.getUrlsFromResources(resource);
104104
if (!urls.length) return;
105105

106106
await env.clipboard.writeText(urls.join('\n'));
@@ -113,14 +113,14 @@ export abstract class RemoteProvider<T extends ResourceDescriptor = ResourceDesc
113113
): Promise<{ uri: Uri; startLine?: number; endLine?: number } | undefined>;
114114

115115
async open(resource: RemoteResource | RemoteResource[]): Promise<boolean | undefined> {
116-
const urls = this.getUrlsFromResources(resource);
116+
const urls = await this.getUrlsFromResources(resource);
117117
if (!urls.length) return false;
118118

119119
const results = await Promise.allSettled(urls.map(openUrl));
120120
return results.every(r => getSettledValue(r) === true);
121121
}
122122

123-
url(resource: RemoteResource): string | undefined {
123+
url(resource: RemoteResource): Promise<string | undefined> | string | undefined {
124124
switch (resource.type) {
125125
case RemoteResourceType.Branch:
126126
return this.getUrlForBranch(resource.branch);
@@ -190,7 +190,7 @@ export abstract class RemoteProvider<T extends ResourceDescriptor = ResourceDesc
190190
base: { branch?: string; remote: { path: string; url: string } },
191191
head: { branch: string; remote: { path: string; url: string } },
192192
options?: { title?: string; description?: string },
193-
): string | undefined;
193+
): Promise<string | undefined> | string | undefined;
194194

195195
protected abstract getUrlForFile(fileName: string, branch?: string, sha?: string, range?: Range): string;
196196

@@ -204,22 +204,19 @@ export abstract class RemoteProvider<T extends ResourceDescriptor = ResourceDesc
204204
return encodeUrl(url)?.replace(/#/g, '%23');
205205
}
206206

207-
private getUrlsFromResources(resource: RemoteResource | RemoteResource[]): string[] {
208-
const urls: string[] = [];
207+
private async getUrlsFromResources(resource: RemoteResource | RemoteResource[]): Promise<string[]> {
208+
const urlPromises: (Promise<string | undefined> | string | undefined)[] = [];
209209

210210
if (Array.isArray(resource)) {
211211
for (const r of resource) {
212-
const url = this.url(r);
213-
if (url == null) continue;
214-
215-
urls.push(url);
212+
urlPromises.push(this.url(r));
216213
}
217214
} else {
218-
const url = this.url(resource);
219-
if (url != null) {
220-
urls.push(url);
221-
}
215+
urlPromises.push(this.url(resource));
222216
}
217+
const urls: string[] = (await Promise.allSettled(urlPromises))
218+
.map(r => getSettledValue(r))
219+
.filter(r => r != null);
223220
return urls;
224221
}
225222
}

src/plus/repos/repositoryIdentityService.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ export class RepositoryIdentityService implements Disposable {
179179
const repoPath = repo.uri.fsPath;
180180

181181
for (const remote of remotes) {
182-
const remoteUrl = remote.provider?.url({ type: RemoteResourceType.Repo });
182+
const remoteUrl = await remote.provider?.url({ type: RemoteResourceType.Repo });
183183
if (remoteUrl != null) {
184184
await this.locator.storeLocation(repoPath, remoteUrl);
185185
}

src/plus/workspaces/workspacesService.ts

+11-11
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import type { OpenWorkspaceLocation } from '../../system/-webview/vscode';
1010
import { openWorkspace } from '../../system/-webview/vscode';
1111
import { log } from '../../system/decorators/log';
1212
import { normalizePath } from '../../system/path';
13+
import { getSettledValue } from '../../system/promise';
1314
import type { SubscriptionChangeEvent } from '../gk/subscriptionService';
1415
import { isSubscriptionStatePaidOrTrial } from '../gk/utils/subscription.utils';
1516
import type { CloudWorkspaceData, CloudWorkspaceRepositoryDescriptor } from './models/cloudWorkspace';
@@ -471,13 +472,12 @@ export class WorkspacesService implements Disposable {
471472
const repoPath = repo.uri.fsPath;
472473

473474
const remotes = await repo.git.remotes().getRemotes();
474-
const remoteUrls: string[] = [];
475-
for (const remote of remotes) {
476-
const remoteUrl = remote.provider?.url({ type: RemoteResourceType.Repo });
477-
if (remoteUrl != null) {
478-
remoteUrls.push(remoteUrl);
479-
}
480-
}
475+
const remoteUrlPromises: Promise<string | undefined>[] = remotes.map(async remote => {
476+
return remote.provider?.url({ type: RemoteResourceType.Repo });
477+
});
478+
const remoteUrls: string[] = (await Promise.allSettled(remoteUrlPromises))
479+
.map(r => getSettledValue(r))
480+
.filter(r => r != null);
481481

482482
for (const remoteUrl of remoteUrls) {
483483
await this._repositoryLocator?.storeLocation(repoPath, remoteUrl);
@@ -904,7 +904,7 @@ export class WorkspacesService implements Disposable {
904904
if (repo == null) continue;
905905
const remote =
906906
(await repo.git.remotes().getRemote('origin')) || (await repo.git.remotes().getRemotes())?.[0];
907-
const remoteDescriptor = getRemoteDescriptor(remote);
907+
const remoteDescriptor = await getRemoteDescriptor(remote);
908908
if (remoteDescriptor == null) continue;
909909
repoInputs.push({
910910
owner: remoteDescriptor.owner,
@@ -1040,7 +1040,7 @@ export class WorkspacesService implements Disposable {
10401040
if (workspace instanceof CloudWorkspace) {
10411041
const remotes = await repo.git.remotes().getRemotes();
10421042
for (const remote of remotes) {
1043-
const remoteDescriptor = getRemoteDescriptor(remote);
1043+
const remoteDescriptor = await getRemoteDescriptor(remote);
10441044
if (remoteDescriptor == null) continue;
10451045
reposProviderMap.set(
10461046
`${remoteDescriptor.provider}/${remoteDescriptor.owner}/${remoteDescriptor.repoName}`,
@@ -1322,15 +1322,15 @@ export class WorkspacesService implements Disposable {
13221322
}
13231323
}
13241324

1325-
function getRemoteDescriptor(remote: GitRemote): RemoteDescriptor | undefined {
1325+
async function getRemoteDescriptor(remote: GitRemote): Promise<RemoteDescriptor | undefined> {
13261326
if (remote.provider?.owner == null) return undefined;
13271327
const remoteRepoName = remote.provider.path.split('/').pop();
13281328
if (remoteRepoName == null) return undefined;
13291329
return {
13301330
provider: remote.provider.id.toLowerCase(),
13311331
owner: remote.provider.owner.toLowerCase(),
13321332
repoName: remoteRepoName.toLowerCase(),
1333-
url: remote.provider.url({ type: RemoteResourceType.Repo }),
1333+
url: await remote.provider.url({ type: RemoteResourceType.Repo }),
13341334
};
13351335
}
13361336

src/webviews/home/homeWebview.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -863,7 +863,7 @@ export class HomeWebviewProvider implements WebviewProvider<State, State, HomeWe
863863
? {
864864
name: remote.provider.name,
865865
icon: remote.provider.icon === 'remote' ? 'cloud' : remote.provider.icon,
866-
url: remote.provider.url({ type: RemoteResourceType.Repo }),
866+
url: await remote.provider.url({ type: RemoteResourceType.Repo }),
867867
}
868868
: undefined,
869869
};

0 commit comments

Comments
 (0)