diff --git a/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts b/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts index bcbc16146d7..c452ce1e2ee 100644 --- a/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts +++ b/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts @@ -18,7 +18,7 @@ import { IExtensionsControlManifest, StatisticType, isTargetPlatformCompatible, TargetPlatformToString, ExtensionManagementErrorCode, InstallOptions, InstallVSIXOptions, UninstallOptions, Metadata, InstallExtensionEvent, DidUninstallExtensionEvent, InstallExtensionResult, UninstallExtensionEvent, IExtensionManagementService, InstallExtensionInfo, EXTENSION_INSTALL_DEP_PACK_CONTEXT } from 'vs/platform/extensionManagement/common/extensionManagement'; -import { areSameExtensions, ExtensionKey, getGalleryExtensionId, getGalleryExtensionTelemetryData, getLocalExtensionTelemetryData } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; +import { adoptToGalleryExtensionId, areSameExtensions, ExtensionKey, getGalleryExtensionId, getGalleryExtensionTelemetryData, getLocalExtensionTelemetryData } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { ExtensionType, IExtensionManifest, isApplicationScopedExtension, TargetPlatform } from 'vs/platform/extensions/common/extensions'; import { ILogService } from 'vs/platform/log/common/log'; import { IProductService } from 'vs/platform/product/common/productService'; @@ -206,7 +206,12 @@ export abstract class AbstractExtensionManagementService extends Disposable impl const results: InstallExtensionResult[] = []; await Promise.allSettled(extensions.map(async e => { try { - const result = await this.installExtension(e); + const result = await this.installExtension(e, (taskToWait: IInstallExtensionTask, taskToWaitFor: IInstallExtensionTask): boolean => { + if (extensions.some(e => adoptToGalleryExtensionId(taskToWaitFor.identifier.id) === getGalleryExtensionId(e.manifest.publisher, e.manifest.name))) { + return false; + } + return this.canWaitForTask(taskToWait, taskToWaitFor); + }); results.push(...result); } catch (error) { results.push({ identifier: { id: getGalleryExtensionId(e.manifest.publisher, e.manifest.name) }, operation: InstallOperation.Install, source: e.extension, error }); @@ -216,7 +221,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl return results; } - private async installExtension({ manifest, extension, options }: InstallableExtension): Promise { + private async installExtension({ manifest, extension, options }: InstallableExtension, shouldWait: (taskToWait: IInstallExtensionTask, taskToWaitFor: IInstallExtensionTask) => boolean): Promise { const isApplicationScoped = options.isApplicationScoped || options.isBuiltin || isApplicationScopedExtension(manifest); const installExtensionTaskOptions: InstallExtensionTaskOptions = { @@ -262,7 +267,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl const key = getInstallExtensionTaskKey(gallery); const existingInstallingExtension = this.installingExtensions.get(key); if (existingInstallingExtension) { - if (this.canWaitForTask(installExtensionTask, existingInstallingExtension.task)) { + if (shouldWait(installExtensionTask, existingInstallingExtension.task)) { const identifier = existingInstallingExtension.task.identifier; this.logService.info('Waiting for already requested installing extension', identifier.id, installExtensionTask.identifier.id); existingInstallingExtension.waitingTasks.push(installExtensionTask); diff --git a/src/vs/workbench/services/extensionManagement/common/extensionManagementChannelClient.ts b/src/vs/workbench/services/extensionManagement/common/extensionManagementChannelClient.ts index c0815fcd50f..733a388aeca 100644 --- a/src/vs/workbench/services/extensionManagement/common/extensionManagementChannelClient.ts +++ b/src/vs/workbench/services/extensionManagement/common/extensionManagementChannelClient.ts @@ -79,7 +79,7 @@ export abstract class ProfileAwareExtensionManagementChannelClient extends BaseE override async installGalleryExtensions(extensions: InstallExtensionInfo[]): Promise { const infos: InstallExtensionInfo[] = []; for (const extension of extensions) { - infos.push({ ...extension, options: { ...extension.options, profileLocation: extension.options?.profileLocation ? (await this.getProfileLocation(extension.options?.profileLocation)) : undefined } }); + infos.push({ ...extension, options: { ...extension.options, profileLocation: await this.getProfileLocation(extension.options?.profileLocation) } }); } return super.installGalleryExtensions(infos); }