Skip to content

Commit 1b7921c

Browse files
sergeibbbaxosoft-ramint
authored andcommitted
Gets provider resource URL asyncronously
(#4142, #4143)
1 parent 63c2939 commit 1b7921c

File tree

7 files changed

+27
-30
lines changed

7 files changed

+27
-30
lines changed

src/env/node/git/localGitProvider.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -516,7 +516,7 @@ export class LocalGitProvider implements GitProvider, Disposable {
516516
case 'gitea':
517517
case 'gerrit':
518518
case 'google-source':
519-
url = remote.provider.url({ type: RemoteResourceType.Repo });
519+
url = await remote.provider.url({ type: RemoteResourceType.Repo });
520520
if (url == null) return ['private', remote];
521521

522522
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);
@@ -186,7 +186,7 @@ export abstract class RemoteProvider<T extends ResourceDescriptor = ResourceDesc
186186
base: { branch?: string; remote: { path: string; url: string } },
187187
head: { branch: string; remote: { path: string; url: string } },
188188
options?: { title?: string; description?: string },
189-
): string | undefined;
189+
): Promise<string | undefined> | string | undefined;
190190

191191
protected abstract getUrlForFile(fileName: string, branch?: string, sha?: string, range?: Range): string;
192192

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

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

206206
if (Array.isArray(resource)) {
207207
for (const r of resource) {
208-
const url = this.url(r);
209-
if (url == null) continue;
210-
211-
urls.push(url);
208+
urlPromises.push(this.url(r));
212209
}
213210
} else {
214-
const url = this.url(resource);
215-
if (url != null) {
216-
urls.push(url);
217-
}
211+
urlPromises.push(this.url(resource));
218212
}
213+
const urls: string[] = (await Promise.allSettled(urlPromises))
214+
.map(r => getSettledValue(r))
215+
.filter(r => r != null);
219216
return urls;
220217
}
221218
}

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';
@@ -473,13 +474,12 @@ export class WorkspacesService implements Disposable {
473474
const repoPath = repo.uri.fsPath;
474475

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

484484
for (const remoteUrl of remoteUrls) {
485485
await this._repositoryLocator?.storeLocation(repoPath, remoteUrl);
@@ -906,7 +906,7 @@ export class WorkspacesService implements Disposable {
906906
if (repo == null) continue;
907907
const remote =
908908
(await repo.git.remotes().getRemote('origin')) || (await repo.git.remotes().getRemotes())?.[0];
909-
const remoteDescriptor = getRemoteDescriptor(remote);
909+
const remoteDescriptor = await getRemoteDescriptor(remote);
910910
if (remoteDescriptor == null) continue;
911911
repoInputs.push({
912912
owner: remoteDescriptor.owner,
@@ -1042,7 +1042,7 @@ export class WorkspacesService implements Disposable {
10421042
if (workspace instanceof CloudWorkspace) {
10431043
const remotes = await repo.git.remotes().getRemotes();
10441044
for (const remote of remotes) {
1045-
const remoteDescriptor = getRemoteDescriptor(remote);
1045+
const remoteDescriptor = await getRemoteDescriptor(remote);
10461046
if (remoteDescriptor == null) continue;
10471047
reposProviderMap.set(
10481048
`${remoteDescriptor.provider}/${remoteDescriptor.owner}/${remoteDescriptor.repoName}`,
@@ -1324,15 +1324,15 @@ export class WorkspacesService implements Disposable {
13241324
}
13251325
}
13261326

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

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
};

src/webviews/plus/graph/graphWebview.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -2567,7 +2567,7 @@ export class GraphWebviewProvider implements WebviewProvider<State, State, Graph
25672567
branchState.provider = {
25682568
name: remote.provider.name,
25692569
icon: remote.provider.icon === 'remote' ? 'cloud' : remote.provider.icon,
2570-
url: remote.provider.url({ type: RemoteResourceType.Repo }),
2570+
url: await remote.provider.url({ type: RemoteResourceType.Repo }),
25712571
};
25722572
}
25732573

src/webviews/plus/graph/graphWebviewUtils.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ export async function formatRepositories(repositories: Repository[]): Promise<Gr
4848
}
4949
: undefined,
5050
icon: remote.provider.icon === 'remote' ? 'cloud' : remote.provider.icon,
51-
url: remote.provider.url({ type: RemoteResourceType.Repo }),
51+
url: await remote.provider.url({ type: RemoteResourceType.Repo }),
5252
}
5353
: undefined,
5454
isVirtual: repo.provider.virtual,

0 commit comments

Comments
 (0)