6
6
import { distinct , isNonEmptyArray } from 'vs/base/common/arrays' ;
7
7
import { Barrier , CancelablePromise , createCancelablePromise } from 'vs/base/common/async' ;
8
8
import { CancellationToken } from 'vs/base/common/cancellation' ;
9
- import { CancellationError , getErrorMessage } from 'vs/base/common/errors' ;
9
+ import { CancellationError , getErrorMessage , isCancellationError } from 'vs/base/common/errors' ;
10
10
import { Emitter , Event } from 'vs/base/common/event' ;
11
11
import { Disposable , toDisposable } from 'vs/base/common/lifecycle' ;
12
12
import { isWeb } from 'vs/base/common/platform' ;
@@ -137,16 +137,6 @@ export abstract class AbstractExtensionManagementService extends Disposable impl
137
137
results . push ( ...await this . installExtensions ( installableExtensions ) ) ;
138
138
}
139
139
140
- for ( const result of results ) {
141
- if ( result . error ) {
142
- this . logService . error ( `Failed to install extension.` , result . identifier . id ) ;
143
- this . logService . error ( result . error ) ;
144
- if ( result . source && ! URI . isUri ( result . source ) ) {
145
- reportTelemetry ( this . telemetryService , 'extensionGallery:install' , { extensionData : getGalleryExtensionTelemetryData ( result . source ) , error : result . error } ) ;
146
- }
147
- }
148
- }
149
-
150
140
return results ;
151
141
}
152
142
@@ -320,7 +310,11 @@ export abstract class AbstractExtensionManagementService extends Disposable impl
320
310
}
321
311
}
322
312
installExtensionResultsMap . set ( key , { local, identifier : task . identifier , operation : task . operation , source : task . source , context : task . options . context , profileLocation : task . profileLocation , applicationScoped : local . isApplicationScoped } ) ;
323
- } catch ( error ) {
313
+ } catch ( e ) {
314
+ const error = toExtensionManagementError ( e ) ;
315
+ if ( ! URI . isUri ( task . source ) ) {
316
+ reportTelemetry ( this . telemetryService , task . operation === InstallOperation . Update ? 'extensionGallery:update' : 'extensionGallery:install' , { extensionData : getGalleryExtensionTelemetryData ( task . source ) , error } ) ;
317
+ }
324
318
installExtensionResultsMap . set ( key , { error, identifier : task . identifier , operation : task . operation , source : task . source , context : task . options . context , profileLocation : task . profileLocation , applicationScoped : task . options . isApplicationScoped } ) ;
325
319
this . logService . error ( 'Error while installing the extension' , task . identifier . id , getErrorMessage ( error ) ) ;
326
320
throw error ;
@@ -446,9 +440,21 @@ export abstract class AbstractExtensionManagementService extends Disposable impl
446
440
}
447
441
}
448
442
449
- // If there are errors, throw the error.
443
+ // Throw if there are errors
450
444
if ( errors . length ) {
451
- throw joinErrors ( errors ) ;
445
+ if ( errors . length === 1 ) {
446
+ throw errors [ 0 ] ;
447
+ }
448
+
449
+ let error = new ExtensionManagementError ( '' , ExtensionManagementErrorCode . Unknown ) ;
450
+ for ( const current of errors ) {
451
+ const code = current instanceof ExtensionManagementError ? current . code : ExtensionManagementErrorCode . Unknown ;
452
+ error = new ExtensionManagementError (
453
+ current . message ? `${ current . message } , ${ error . message } ` : error . message ,
454
+ code !== ExtensionManagementErrorCode . Unknown && code !== ExtensionManagementErrorCode . Internal ? code : error . code
455
+ ) ;
456
+ }
457
+ throw error ;
452
458
}
453
459
454
460
return results ;
@@ -660,7 +666,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl
660
666
}
661
667
postUninstallExtension ( task . extension ) ;
662
668
} catch ( e ) {
663
- const error = e instanceof ExtensionManagementError ? e : new ExtensionManagementError ( getErrorMessage ( e ) , ExtensionManagementErrorCode . Internal ) ;
669
+ const error = toExtensionManagementError ( e ) ;
664
670
postUninstallExtension ( task . extension , error ) ;
665
671
throw error ;
666
672
} finally {
@@ -669,7 +675,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl
669
675
} ) ) ;
670
676
671
677
} catch ( e ) {
672
- const error = e instanceof ExtensionManagementError ? e : new ExtensionManagementError ( getErrorMessage ( e ) , ExtensionManagementErrorCode . Internal ) ;
678
+ const error = toExtensionManagementError ( e ) ;
673
679
for ( const task of allTasks ) {
674
680
// cancel the tasks
675
681
try { task . cancel ( ) ; } catch ( error ) { /* ignore */ }
@@ -781,16 +787,6 @@ export abstract class AbstractExtensionManagementService extends Disposable impl
781
787
protected abstract copyExtension ( extension : ILocalExtension , fromProfileLocation : URI , toProfileLocation : URI , metadata ?: Partial < Metadata > ) : Promise < ILocalExtension > ;
782
788
}
783
789
784
- export function joinErrors ( errorOrErrors : ( Error | string ) | ( Array < Error | string > ) ) : Error {
785
- const errors = Array . isArray ( errorOrErrors ) ? errorOrErrors : [ errorOrErrors ] ;
786
- if ( errors . length === 1 ) {
787
- return errors [ 0 ] instanceof Error ? < Error > errors [ 0 ] : new Error ( < string > errors [ 0 ] ) ;
788
- }
789
- return errors . reduce < Error > ( ( previousValue : Error , currentValue : Error | string ) => {
790
- return new Error ( `${ previousValue . message } ${ previousValue . message ? ',' : '' } ${ currentValue instanceof Error ? currentValue . message : currentValue } ` ) ;
791
- } , new Error ( '' ) ) ;
792
- }
793
-
794
790
export function toExtensionManagementError ( error : Error ) : ExtensionManagementError {
795
791
if ( error instanceof ExtensionManagementError ) {
796
792
return error ;
@@ -800,12 +796,12 @@ export function toExtensionManagementError(error: Error): ExtensionManagementErr
800
796
e . stack = error . stack ;
801
797
return e ;
802
798
}
803
- const e = new ExtensionManagementError ( error . message , ExtensionManagementErrorCode . Internal ) ;
799
+ const e = new ExtensionManagementError ( error . message , isCancellationError ( error ) ? ExtensionManagementErrorCode . Cancelled : ExtensionManagementErrorCode . Internal ) ;
804
800
e . stack = error . stack ;
805
801
return e ;
806
802
}
807
803
808
- function reportTelemetry ( telemetryService : ITelemetryService , eventName : string , { extensionData, verificationStatus, duration, error, durationSinceUpdate } : { extensionData : any ; verificationStatus ?: ExtensionVerificationStatus ; duration ?: number ; durationSinceUpdate ?: number ; error ?: Error } ) : void {
804
+ function reportTelemetry ( telemetryService : ITelemetryService , eventName : string , { extensionData, verificationStatus, duration, error, durationSinceUpdate } : { extensionData : any ; verificationStatus ?: ExtensionVerificationStatus ; duration ?: number ; durationSinceUpdate ?: number ; error ?: ExtensionManagementError | ExtensionGalleryError } ) : void {
809
805
let errorcode : string | undefined ;
810
806
let errorcodeDetail : string | undefined ;
811
807
@@ -822,13 +818,9 @@ function reportTelemetry(telemetryService: ITelemetryService, eventName: string,
822
818
}
823
819
824
820
if ( error ) {
825
- if ( error instanceof ExtensionManagementError || error instanceof ExtensionGalleryError ) {
826
- errorcode = error . code ;
827
- if ( error . code === ExtensionManagementErrorCode . Signature ) {
828
- errorcodeDetail = error . message ;
829
- }
830
- } else {
831
- errorcode = ExtensionManagementErrorCode . Internal ;
821
+ errorcode = error . code ;
822
+ if ( error . code === ExtensionManagementErrorCode . Signature ) {
823
+ errorcodeDetail = error . message ;
832
824
}
833
825
}
834
826
0 commit comments