55
66import { CancellationToken } from '../../../../base/common/cancellation.js' ;
77import { IEnvironmentService } from '../../../../platform/environment/common/environment.js' ;
8- import { IExtensionGalleryService , IExtensionManagementService } from '../../../../platform/extensionManagement/common/extensionManagement.js' ;
8+ import { IExtensionGalleryService , IExtensionManagementService , InstallExtensionInfo } from '../../../../platform/extensionManagement/common/extensionManagement.js' ;
99import { areSameExtensions } from '../../../../platform/extensionManagement/common/extensionManagementUtil.js' ;
1010import { IFileService } from '../../../../platform/files/common/files.js' ;
1111import { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js' ;
1212import { ServiceCollection } from '../../../../platform/instantiation/common/serviceCollection.js' ;
1313import { ILogService } from '../../../../platform/log/common/log.js' ;
1414import { IRemoteAuthorityResolverService } from '../../../../platform/remote/common/remoteAuthorityResolver.js' ;
15+ import { IRemoteExtensionsScannerService } from '../../../../platform/remote/common/remoteExtensionsScanner.js' ;
1516import { IStorageService , IS_NEW_KEY , StorageScope , StorageTarget } from '../../../../platform/storage/common/storage.js' ;
1617import { IUriIdentityService } from '../../../../platform/uriIdentity/common/uriIdentity.js' ;
1718import { IUserDataProfilesService } from '../../../../platform/userDataProfile/common/userDataProfile.js' ;
@@ -25,6 +26,51 @@ import { IExtensionManagementServerService } from '../../../services/extensionMa
2526import { IExtensionManifestPropertiesService } from '../../../services/extensions/common/extensionManifestPropertiesService.js' ;
2627import { IRemoteAgentService } from '../../../services/remote/common/remoteAgentService.js' ;
2728
29+ export class InstallFailedRemoteExtensionsContribution implements IWorkbenchContribution {
30+ constructor (
31+ @IRemoteAgentService private readonly remoteAgentService : IRemoteAgentService ,
32+ @IRemoteExtensionsScannerService private readonly remoteExtensionsScannerService : IRemoteExtensionsScannerService ,
33+ @IExtensionGalleryService private readonly extensionGalleryService : IExtensionGalleryService ,
34+ @IExtensionManagementServerService private readonly extensionManagementServerService : IExtensionManagementServerService ,
35+ @ILogService private readonly logService : ILogService
36+ ) {
37+ this . installFailedRemoteExtensions ( ) ;
38+ }
39+
40+ private async installFailedRemoteExtensions ( ) : Promise < void > {
41+ if ( ! this . remoteAgentService . getConnection ( ) ) {
42+ return ;
43+ }
44+
45+ const { failed } = await this . remoteExtensionsScannerService . whenExtensionsReady ( ) ;
46+ if ( failed . length === 0 ) {
47+ this . logService . trace ( 'No extensions relayed from server' ) ;
48+ return ;
49+ }
50+
51+ if ( ! this . extensionManagementServerService . remoteExtensionManagementServer ) {
52+ this . logService . error ( 'No remote extension management server available' ) ;
53+ return ;
54+ }
55+
56+ this . logService . info ( `Installing '${ failed . length } ' extensions relayed from server` ) ;
57+ const galleryExtensions = await this . extensionGalleryService . getExtensions ( failed . map ( ( { id } ) => ( { id } ) ) , CancellationToken . None ) ;
58+ const installExtensionInfo : InstallExtensionInfo [ ] = [ ] ;
59+ for ( const { id, installOptions } of failed ) {
60+ const extension = galleryExtensions . find ( e => areSameExtensions ( e . identifier , { id } ) ) ;
61+ if ( extension ) {
62+ installExtensionInfo . push ( { extension, options : installOptions } ) ;
63+ } else {
64+ this . logService . warn ( `Relayed failed extension '${ id } ' from server is not found in the gallery` ) ;
65+ }
66+ }
67+
68+ if ( installExtensionInfo . length ) {
69+ await this . extensionManagementServerService . remoteExtensionManagementServer . extensionManagementService . installGalleryExtensions ( installExtensionInfo ) ;
70+ }
71+ }
72+ }
73+
2874export class RemoteExtensionsInitializerContribution implements IWorkbenchContribution {
2975 constructor (
3076 @IExtensionManagementServerService private readonly extensionManagementServerService : IExtensionManagementServerService ,
0 commit comments