From a337b4ef65efbe3595a8a5686bc334ca4dbfcde5 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 20 Mar 2024 02:02:07 +0100 Subject: [PATCH] fix #207698 (#208150) * fix #207698 * fix compilation --- .../node/extensionManagementService.ts | 39 ++++++++++++++++++- .../node/installGalleryExtensionTask.test.ts | 1 + 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index 58ce27065ed..56e32e7a269 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -288,7 +288,7 @@ export class ExtensionManagementService extends AbstractExtensionManagementServi const key = ExtensionKey.create(extension).toString(); let installExtensionTask = this.installGalleryExtensionsTasks.get(key); if (!installExtensionTask) { - this.installGalleryExtensionsTasks.set(key, installExtensionTask = new InstallGalleryExtensionTask(manifest, extension, options, this.extensionsDownloader, this.extensionsScanner, this.uriIdentityService, this.userDataProfilesService, this.extensionsScannerService, this.extensionsProfileScannerService, this.logService)); + this.installGalleryExtensionsTasks.set(key, installExtensionTask = new InstallGalleryExtensionTask(manifest, extension, options, this.extensionsDownloader, this.extensionsScanner, this.uriIdentityService, this.userDataProfilesService, this.extensionsScannerService, this.extensionsProfileScannerService, this.logService, this.telemetryService)); installExtensionTask.waitUntilTaskIsFinished().finally(() => this.installGalleryExtensionsTasks.delete(key)); } return installExtensionTask; @@ -875,6 +875,7 @@ export class InstallGalleryExtensionTask extends InstallExtensionTask { extensionsScannerService: IExtensionsScannerService, extensionsProfileScannerService: IExtensionsProfileScannerService, logService: ILogService, + private readonly telemetryService: ITelemetryService, ) { super(gallery.identifier, gallery, options, extensionsScanner, uriIdentityService, userDataProfilesService, extensionsScannerService, extensionsProfileScannerService, logService); } @@ -921,6 +922,42 @@ export class InstallGalleryExtensionTask extends InstallExtensionTask { } } + try { + return await this.downloadAndInstallExtension(metadata, token); + } catch (error) { + if (error instanceof ExtensionManagementError && (error.code === ExtensionManagementErrorCode.CorruptZip || error.code === ExtensionManagementErrorCode.IncompleteZip)) { + this.logService.info(`Downloaded VSIX is invalid. Trying to download and install again...`, this.gallery.identifier.id); + type RetryInstallingInvalidVSIXClassification = { + owner: 'sandy081'; + comment: 'Event reporting the retry of installing an invalid VSIX'; + extensionId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Extension Id' }; + succeeded?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Success value' }; + }; + type RetryInstallingInvalidVSIXEvent = { + extensionId: string; + succeeded: boolean; + }; + try { + const result = await this.downloadAndInstallExtension(metadata, token); + this.telemetryService.publicLog2('extensiongallery:install:retry', { + extensionId: this.gallery.identifier.id, + succeeded: true + }); + return result; + } catch (error) { + this.telemetryService.publicLog2('extensiongallery:install:retry', { + extensionId: this.gallery.identifier.id, + succeeded: false + }); + throw error; + } + } else { + throw error; + } + } + } + + private async downloadAndInstallExtension(metadata: Metadata, token: CancellationToken): Promise<[ILocalExtension, Metadata]> { const { location, verificationStatus } = await this.extensionsDownloader.download(this.gallery, this._operation, !this.options.donotVerifySignature); try { this._verificationStatus = verificationStatus; diff --git a/src/vs/platform/extensionManagement/test/node/installGalleryExtensionTask.test.ts b/src/vs/platform/extensionManagement/test/node/installGalleryExtensionTask.test.ts index 7c40a4af114..1b27c8504d8 100644 --- a/src/vs/platform/extensionManagement/test/node/installGalleryExtensionTask.test.ts +++ b/src/vs/platform/extensionManagement/test/node/installGalleryExtensionTask.test.ts @@ -110,6 +110,7 @@ class TestInstallGalleryExtensionTask extends InstallGalleryExtensionTask { extensionsScannerService, extensionsProfileScannerService, logService, + NullTelemetryService ); }