From be4c73801b6cae5e7312fe3f5f9b3b4acf21f10e Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 10 May 2018 01:50:04 +0200 Subject: [PATCH] Fix #49583 --- .../node/extensionManagementService.ts | 41 ++++++++++++------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index 61eb637d98c..62097257f7c 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -102,6 +102,11 @@ interface InstallableExtension { metadata?: IGalleryMetadata; } +enum Operation { + Install = 1, + Update +} + export class ExtensionManagementService extends Disposable implements IExtensionManagementService { _serviceBrand: any; @@ -227,19 +232,21 @@ export class ExtensionManagementService extends Disposable implements IExtension installFromGallery(extension: IGalleryExtension): TPromise { this.onInstallExtensions([extension]); - return this.collectExtensionsToInstall(extension) - .then( - extensionsToInstall => { - if (extensionsToInstall.length > 1) { - this.onInstallExtensions(extensionsToInstall.slice(1)); - } - return this.downloadAndInstallExtensions(extensionsToInstall) - .then( - locals => this.onDidInstallExtensions(extensionsToInstall, locals, []) - .then(() => locals.filter(l => areSameExtensions({ id: getGalleryExtensionIdFromLocal(l), uuid: l.identifier.uuid }, extension.identifier)[0])), - errors => this.onDidInstallExtensions(extensionsToInstall, [], errors)); - }, - error => this.onDidInstallExtensions([extension], [], [error])); + return this.getInstalled(LocalExtensionType.User) + .then(installed => this.collectExtensionsToInstall(extension) + .then( + extensionsToInstall => { + if (extensionsToInstall.length > 1) { + this.onInstallExtensions(extensionsToInstall.slice(1)); + } + const operataions: Operation[] = extensionsToInstall.map(e => this.getOperation(e, installed)); + return this.downloadAndInstallExtensions(extensionsToInstall) + .then( + locals => this.onDidInstallExtensions(extensionsToInstall, locals, operataions, []) + .then(() => locals.filter(l => areSameExtensions({ id: getGalleryExtensionIdFromLocal(l), uuid: l.identifier.uuid }, extension.identifier)[0])), + errors => this.onDidInstallExtensions(extensionsToInstall, [], operataions, errors)); + }, + error => this.onDidInstallExtensions([extension], [], [this.getOperation(extension, installed)], [error]))); } reinstallFromGallery(extension: ILocalExtension): TPromise { @@ -259,6 +266,10 @@ export class ExtensionManagementService extends Disposable implements IExtension }); } + private getOperation(extensionToInstall: IGalleryExtension, installed: ILocalExtension[]): Operation { + return installed.some(i => areSameExtensions({ id: getGalleryExtensionIdFromLocal(i), uuid: i.identifier.uuid }, extensionToInstall.identifier)) ? Operation.Update : Operation.Install; + } + private collectExtensionsToInstall(extension: IGalleryExtension): TPromise { return this.galleryService.loadCompatibleVersion(extension) .then(compatible => { @@ -340,7 +351,7 @@ export class ExtensionManagementService extends Disposable implements IExtension } } - private onDidInstallExtensions(extensions: IGalleryExtension[], locals: ILocalExtension[], errors: Error[]): TPromise { + private onDidInstallExtensions(extensions: IGalleryExtension[], locals: ILocalExtension[], operations: Operation[], errors: Error[]): TPromise { extensions.forEach((gallery, index) => { const identifier = { id: getLocalExtensionIdFromGallery(gallery, gallery.version), uuid: gallery.identifier.uuid }; const local = locals[index]; @@ -354,7 +365,7 @@ export class ExtensionManagementService extends Disposable implements IExtension this._onDidInstallExtension.fire({ identifier, gallery, error: errorCode }); } const startTime = this.installationStartTime.get(gallery.identifier.id); - this.reportTelemetry('extensionGallery:install', getGalleryExtensionTelemetryData(gallery), startTime ? new Date().getTime() - startTime : void 0, error); + this.reportTelemetry(operations[index] === Operation.Install ? 'extensionGallery:install' : 'extensionGallery:update', getGalleryExtensionTelemetryData(gallery), startTime ? new Date().getTime() - startTime : void 0, error); this.installationStartTime.delete(gallery.identifier.id); }); return errors.length ? TPromise.wrapError(this.joinErrors(errors)) : TPromise.as(null); -- GitLab