@@ -13,11 +13,12 @@ import { assign } from 'vs/base/common/objects';
1313import { IDisposable , dispose } from 'vs/base/common/lifecycle' ;
1414import { flatten , distinct } from 'vs/base/common/arrays' ;
1515import { extract , buffer } from 'vs/base/node/zip' ;
16- import { Promise , TPromise } from 'vs/base/common/winjs.base' ;
16+ import { TPromise } from 'vs/base/common/winjs.base' ;
1717import {
1818 IExtensionManagementService , IExtensionGalleryService , ILocalExtension ,
1919 IGalleryExtension , IExtensionManifest , IGalleryMetadata ,
20- InstallExtensionEvent , DidInstallExtensionEvent , DidUninstallExtensionEvent , LocalExtensionType
20+ InstallExtensionEvent , DidInstallExtensionEvent , DidUninstallExtensionEvent , LocalExtensionType ,
21+ StatisticType
2122} from 'vs/platform/extensionManagement/common/extensionManagement' ;
2223import { getLocalExtensionIdFromGallery , getLocalExtensionIdFromManifest , getGalleryExtensionIdFromLocal , getIdAndVersionFromLocalExtensionId , adoptToGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil' ;
2324import { localizeManifest } from '../common/extensionNls' ;
@@ -223,9 +224,9 @@ export class ExtensionManagementService implements IExtensionManagementService {
223224 }
224225
225226 private rollback ( localExtension : ILocalExtension , dependecies : IGalleryExtension [ ] ) : TPromise < void > {
226- return this . doUninstall ( localExtension . id )
227+ return this . doUninstall ( localExtension )
227228 . then ( ( ) => this . filterOutUninstalled ( dependecies ) )
228- . then ( installed => TPromise . join ( installed . map ( ( i ) => this . doUninstall ( i . id ) ) ) )
229+ . then ( installed => TPromise . join ( installed . map ( ( i ) => this . doUninstall ( i ) ) ) )
229230 . then ( ( ) => null ) ;
230231 }
231232
@@ -304,11 +305,11 @@ export class ExtensionManagementService implements IExtensionManagementService {
304305 }
305306
306307 private checkForDependenciesAndUninstall ( extension : ILocalExtension , installed : ILocalExtension [ ] , force : boolean ) : TPromise < void > {
307- return this . preUninstallExtension ( extension . id )
308+ return this . preUninstallExtension ( extension )
308309 . then ( ( ) => this . hasDependencies ( extension , installed ) ? this . promptForDependenciesAndUninstall ( extension , installed , force ) : this . promptAndUninstall ( extension , installed , force ) )
309- . then ( ( ) => this . postUninstallExtension ( extension . id ) ,
310+ . then ( ( ) => this . postUninstallExtension ( extension ) ,
310311 error => {
311- this . postUninstallExtension ( extension . id , error ) ;
312+ this . postUninstallExtension ( extension , error ) ;
312313 return TPromise . wrapError ( error ) ;
313314 } ) ;
314315 }
@@ -370,7 +371,7 @@ export class ExtensionManagementService implements IExtensionManagementService {
370371 if ( dependents . length ) {
371372 return TPromise . wrapError < void > ( new Error ( this . getDependentsErrorMessage ( extension , dependents ) ) ) ;
372373 }
373- return TPromise . join ( [ this . uninstallExtension ( extension . id ) , ...dependenciesToUninstall . map ( d => this . doUninstall ( d . id ) ) ] ) . then ( ( ) => null ) ;
374+ return TPromise . join ( [ this . uninstallExtension ( extension . id ) , ...dependenciesToUninstall . map ( d => this . doUninstall ( d ) ) ] ) . then ( ( ) => null ) ;
374375 }
375376
376377 private getDependentsErrorMessage ( extension : ILocalExtension , dependents : ILocalExtension [ ] ) : string {
@@ -419,21 +420,21 @@ export class ExtensionManagementService implements IExtensionManagementService {
419420 return installed . filter ( e => e . manifest . extensionDependencies && e . manifest . extensionDependencies . indexOf ( getGalleryExtensionIdFromLocal ( extension ) ) !== - 1 ) ;
420421 }
421422
422- private doUninstall ( id : string ) : TPromise < void > {
423- return this . preUninstallExtension ( id )
424- . then ( ( ) => this . uninstallExtension ( id ) )
425- . then ( ( ) => this . postUninstallExtension ( id ) ,
423+ private doUninstall ( extension : ILocalExtension ) : TPromise < void > {
424+ return this . preUninstallExtension ( extension )
425+ . then ( ( ) => this . uninstallExtension ( extension . id ) )
426+ . then ( ( ) => this . postUninstallExtension ( extension ) ,
426427 error => {
427- this . postUninstallExtension ( id , error ) ;
428+ this . postUninstallExtension ( extension , error ) ;
428429 return TPromise . wrapError ( error ) ;
429430 } ) ;
430431 }
431432
432- private preUninstallExtension ( id : string ) : TPromise < void > {
433- const extensionPath = path . join ( this . extensionsPath , id ) ;
433+ private preUninstallExtension ( extension : ILocalExtension ) : TPromise < void > {
434+ const extensionPath = path . join ( this . extensionsPath , extension . id ) ;
434435 return pfs . exists ( extensionPath )
435436 . then ( exists => exists ? null : TPromise . wrapError ( new Error ( nls . localize ( 'notExists' , "Could not find extension" ) ) ) )
436- . then ( ( ) => this . _onUninstallExtension . fire ( id ) ) ;
437+ . then ( ( ) => this . _onUninstallExtension . fire ( extension . id ) ) ;
437438 }
438439
439440 private uninstallExtension ( id : string ) : TPromise < void > {
@@ -443,8 +444,12 @@ export class ExtensionManagementService implements IExtensionManagementService {
443444 . then ( ( ) => this . unsetObsolete ( id ) ) ;
444445 }
445446
446- private postUninstallExtension ( id : string , error ?: any ) : TPromise < void > {
447- return this . _onDidUninstallExtension . fire ( { id, error } ) ;
447+ private async postUninstallExtension ( extension : ILocalExtension , error ?: any ) : TPromise < void > {
448+ if ( ! error ) {
449+ await this . galleryService . reportStatistic ( extension . manifest . publisher , extension . manifest . name , extension . manifest . version , StatisticType . Uninstall ) ;
450+ }
451+
452+ this . _onDidUninstallExtension . fire ( { id : extension . id , error } ) ;
448453 }
449454
450455 getInstalled ( type : LocalExtensionType = null ) : TPromise < ILocalExtension [ ] > {
@@ -476,7 +481,7 @@ export class ExtensionManagementService implements IExtensionManagementService {
476481 const limiter = new Limiter ( 10 ) ;
477482
478483 return this . scanExtensionFolders ( root )
479- . then ( extensionIds => Promise . join ( extensionIds . map ( id => {
484+ . then ( extensionIds => TPromise . join ( extensionIds . map ( id => {
480485 const extensionPath = path . join ( root , id ) ;
481486
482487 const each = ( ) => pfs . readdir ( extensionPath ) . then ( children => {
0 commit comments