mirror of
https://github.com/microsoft/vscode.git
synced 2026-08-22 13:13:08 +01:00
init default profile extensions on main
This commit is contained in:
@@ -31,7 +31,7 @@ import { INativeEnvironmentService } from 'vs/platform/environment/common/enviro
|
||||
import { SharedProcessEnvironmentService } from 'vs/platform/sharedProcess/node/sharedProcessEnvironmentService';
|
||||
import { GlobalExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionEnablementService';
|
||||
import { ExtensionGalleryService } from 'vs/platform/extensionManagement/common/extensionGalleryService';
|
||||
import { IDefaultExtensionsProfileInitService, IExtensionGalleryService, IExtensionManagementService, IExtensionTipsService, IGlobalExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionManagement';
|
||||
import { IExtensionGalleryService, IExtensionManagementService, IExtensionTipsService, IGlobalExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionManagement';
|
||||
import { ExtensionManagementChannel, ExtensionTipsChannel } from 'vs/platform/extensionManagement/common/extensionManagementIpc';
|
||||
import { ExtensionTipsService } from 'vs/platform/extensionManagement/electron-sandbox/extensionTipsService';
|
||||
import { ExtensionManagementService, INativeServerExtensionManagementService } from 'vs/platform/extensionManagement/node/extensionManagementService';
|
||||
@@ -103,7 +103,6 @@ import { ExtensionsProfileScannerService, IExtensionsProfileScannerService } fro
|
||||
import { PolicyChannelClient } from 'vs/platform/policy/common/policyIpc';
|
||||
import { IPolicyService, NullPolicyService } from 'vs/platform/policy/common/policy';
|
||||
import { UserDataProfilesNativeService } from 'vs/platform/userDataProfile/electron-sandbox/userDataProfile';
|
||||
import { DefaultExtensionsProfileInitService } from 'vs/platform/extensionManagement/electron-sandbox/defaultExtensionsProfileInit';
|
||||
import { SharedProcessRequestService } from 'vs/platform/request/electron-browser/sharedProcessRequestService';
|
||||
import { OneDataSystemAppender } from 'vs/platform/telemetry/node/1dsAppender';
|
||||
|
||||
@@ -311,7 +310,6 @@ class SharedProcessMain extends Disposable {
|
||||
services.set(IExtensionsProfileScannerService, new SyncDescriptor(ExtensionsProfileScannerService));
|
||||
services.set(IExtensionsScannerService, new SyncDescriptor(ExtensionsScannerService));
|
||||
services.set(INativeServerExtensionManagementService, new SyncDescriptor(ExtensionManagementService));
|
||||
services.set(IDefaultExtensionsProfileInitService, new SyncDescriptor(DefaultExtensionsProfileInitService));
|
||||
|
||||
// Extension Gallery
|
||||
services.set(IExtensionGalleryService, new SyncDescriptor(ExtensionGalleryService));
|
||||
@@ -423,8 +421,6 @@ class SharedProcessMain extends Disposable {
|
||||
const sharedProcessWorkerChannel = ProxyChannel.fromService(accessor.get(ISharedProcessWorkerService));
|
||||
this.server.registerChannel(ipcSharedProcessWorkerChannelName, sharedProcessWorkerChannel);
|
||||
|
||||
// Default Extensions Profile Init
|
||||
this.server.registerChannel('IDefaultExtensionsProfileInitService', ProxyChannel.fromService(accessor.get(IDefaultExtensionsProfileInitService)));
|
||||
}
|
||||
|
||||
private registerErrorHandler(logService: ILogService): void {
|
||||
|
||||
@@ -693,7 +693,8 @@ export class CodeApplication extends Disposable {
|
||||
}
|
||||
|
||||
// Default Extensions Profile Init
|
||||
services.set(IDefaultExtensionsProfileInitService, ProxyChannel.toService(getDelayedChannel(sharedProcessReady.then(client => client.getChannel('IDefaultExtensionsProfileInitService')))));
|
||||
services.set(IExtensionsProfileScannerService, new SyncDescriptor(ExtensionsProfileScannerService));
|
||||
services.set(IExtensionsScannerService, new SyncDescriptor(ExtensionsScannerService));
|
||||
|
||||
// Init services that require it
|
||||
await backupMainService.initialize();
|
||||
|
||||
@@ -528,10 +528,3 @@ export interface IExtensionManagementCLIService {
|
||||
uninstallExtensions(extensions: (string | URI)[], force: boolean, output?: CLIOutput): Promise<void>;
|
||||
locateExtension(extensions: string[], output?: CLIOutput): Promise<void>;
|
||||
}
|
||||
|
||||
export const IDefaultExtensionsProfileInitService = createDecorator<IDefaultExtensionsProfileInitService>('IDefaultExtensionsProfileInitService');
|
||||
export interface IDefaultExtensionsProfileInitService {
|
||||
readonly _serviceBrand: undefined;
|
||||
initialize(): Promise<void>;
|
||||
uninitialize(): Promise<void>;
|
||||
}
|
||||
|
||||
@@ -8,9 +8,9 @@ import { VSBuffer } from 'vs/base/common/buffer';
|
||||
import { Disposable } from 'vs/base/common/lifecycle';
|
||||
import { ResourceMap } from 'vs/base/common/map';
|
||||
import { URI, UriComponents } from 'vs/base/common/uri';
|
||||
import { ILocalExtension, Metadata } from 'vs/platform/extensionManagement/common/extensionManagement';
|
||||
import { Metadata } from 'vs/platform/extensionManagement/common/extensionManagement';
|
||||
import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil';
|
||||
import { IExtensionIdentifier } from 'vs/platform/extensions/common/extensions';
|
||||
import { IExtension, IExtensionIdentifier } from 'vs/platform/extensions/common/extensions';
|
||||
import { FileOperationError, FileOperationResult, IFileService } from 'vs/platform/files/common/files';
|
||||
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
|
||||
import { ILogService } from 'vs/platform/log/common/log';
|
||||
@@ -34,7 +34,7 @@ export interface IExtensionsProfileScannerService {
|
||||
readonly _serviceBrand: undefined;
|
||||
|
||||
scanProfileExtensions(profileLocation: URI): Promise<IScannedProfileExtension[]>;
|
||||
addExtensionsToProfile(extensions: [ILocalExtension, Metadata | undefined][], profileLocation: URI): Promise<IScannedProfileExtension[]>;
|
||||
addExtensionsToProfile(extensions: [IExtension, Metadata | undefined][], profileLocation: URI): Promise<IScannedProfileExtension[]>;
|
||||
removeExtensionFromProfile(identifier: IExtensionIdentifier, profileLocation: URI): Promise<IScannedProfileExtension[]>;
|
||||
}
|
||||
|
||||
@@ -54,7 +54,7 @@ export class ExtensionsProfileScannerService extends Disposable implements IExte
|
||||
return this.withProfileExtensions(profileLocation);
|
||||
}
|
||||
|
||||
addExtensionsToProfile(extensions: [ILocalExtension, Metadata][], profileLocation: URI): Promise<IScannedProfileExtension[]> {
|
||||
addExtensionsToProfile(extensions: [IExtension, Metadata][], profileLocation: URI): Promise<IScannedProfileExtension[]> {
|
||||
return this.withProfileExtensions(profileLocation, profileExtensions => {
|
||||
// Remove the existing extension to avoid duplicates
|
||||
profileExtensions = profileExtensions.filter(e => extensions.some(([extension]) => !areSameExtensions(e.identifier, extension.identifier)));
|
||||
|
||||
@@ -4,24 +4,48 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { Disposable } from 'vs/base/common/lifecycle';
|
||||
import { IDefaultExtensionsProfileInitService } from 'vs/platform/extensionManagement/common/extensionManagement';
|
||||
import { joinPath } from 'vs/base/common/resources';
|
||||
import { URI } from 'vs/base/common/uri';
|
||||
import { IExtensionsProfileScannerService } from 'vs/platform/extensionManagement/common/extensionsProfileScannerService';
|
||||
import { IExtensionsScannerService } from 'vs/platform/extensionManagement/common/extensionsScannerService';
|
||||
import { IFileService } from 'vs/platform/files/common/files';
|
||||
import { EXTENSIONS_RESOURCE_NAME } from 'vs/platform/userDataProfile/common/userDataProfile';
|
||||
import { IUserDataProfilesMainService } from 'vs/platform/userDataProfile/electron-main/userDataProfile';
|
||||
|
||||
export class DefaultExtensionsProfileInitHandler extends Disposable {
|
||||
constructor(
|
||||
@IDefaultExtensionsProfileInitService private readonly defaultExtensionsProfileInitService: IDefaultExtensionsProfileInitService,
|
||||
@IUserDataProfilesMainService userDataProfilesService: IUserDataProfilesMainService,
|
||||
@IUserDataProfilesMainService private readonly userDataProfilesService: IUserDataProfilesMainService,
|
||||
@IFileService private readonly fileService: IFileService,
|
||||
@IExtensionsScannerService private readonly extensionsScannerService: IExtensionsScannerService,
|
||||
@IExtensionsProfileScannerService private readonly extensionsProfileScannerService: IExtensionsProfileScannerService,
|
||||
) {
|
||||
super();
|
||||
this._register(userDataProfilesService.onWillCreateProfile(e => {
|
||||
if (userDataProfilesService.profiles.length === 1) {
|
||||
e.join(this.defaultExtensionsProfileInitService.initialize());
|
||||
e.join(this.initialize());
|
||||
}
|
||||
}));
|
||||
this._register(userDataProfilesService.onDidChangeProfiles(e => {
|
||||
if (userDataProfilesService.profiles.length === 1) {
|
||||
this.defaultExtensionsProfileInitService.uninitialize();
|
||||
this.uninitialize();
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
private async initialize(): Promise<void> {
|
||||
/* Create and populate the default extensions profile resource */
|
||||
const extensionsProfileResource = this.getDefaultExtensionsProfileResource();
|
||||
try { await this.fileService.del(extensionsProfileResource); } catch (error) { /* ignore */ }
|
||||
const userExtensions = await this.extensionsScannerService.scanUserExtensions({ includeInvalid: true });
|
||||
await this.extensionsProfileScannerService.addExtensionsToProfile(userExtensions.map(e => [e, e.metadata]), extensionsProfileResource);
|
||||
}
|
||||
|
||||
private async uninitialize(): Promise<void> {
|
||||
/* Remove the default extensions profile resource */
|
||||
try { await this.fileService.del(this.getDefaultExtensionsProfileResource()); } catch (error) { /* ignore */ }
|
||||
}
|
||||
|
||||
private getDefaultExtensionsProfileResource(): URI {
|
||||
return this.userDataProfilesService.defaultProfile.extensionsResource ?? joinPath(this.userDataProfilesService.defaultProfile.location, EXTENSIONS_RESOURCE_NAME);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { Disposable } from 'vs/base/common/lifecycle';
|
||||
import { joinPath } from 'vs/base/common/resources';
|
||||
import { URI } from 'vs/base/common/uri';
|
||||
import { IDefaultExtensionsProfileInitService, IExtensionManagementService, ILocalExtension, Metadata } from 'vs/platform/extensionManagement/common/extensionManagement';
|
||||
import { IExtensionsProfileScannerService } from 'vs/platform/extensionManagement/common/extensionsProfileScannerService';
|
||||
import { ExtensionType } from 'vs/platform/extensions/common/extensions';
|
||||
import { IFileService } from 'vs/platform/files/common/files';
|
||||
import { EXTENSIONS_RESOURCE_NAME, IUserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile';
|
||||
|
||||
export class DefaultExtensionsProfileInitService extends Disposable implements IDefaultExtensionsProfileInitService {
|
||||
|
||||
readonly _serviceBrand: undefined;
|
||||
|
||||
constructor(
|
||||
@IUserDataProfilesService private readonly userDataProfilesService: IUserDataProfilesService,
|
||||
@IFileService private readonly fileService: IFileService,
|
||||
@IExtensionManagementService private readonly extensionManagementService: IExtensionManagementService,
|
||||
@IExtensionsProfileScannerService private readonly extensionsProfileScannerService: IExtensionsProfileScannerService,
|
||||
) {
|
||||
super();
|
||||
}
|
||||
|
||||
async initialize(): Promise<void> {
|
||||
/* Create and populate the default extensions profile resource */
|
||||
const extensionsProfileResource = this.getDefaultExtensionsProfileResource();
|
||||
try { await this.fileService.del(extensionsProfileResource); } catch (error) { /* ignore */ }
|
||||
const userExtensions = await this.extensionManagementService.getInstalled(ExtensionType.User);
|
||||
const extensions: [ILocalExtension, Metadata | undefined][] = await Promise.all(userExtensions.map(async e => ([e, await this.extensionManagementService.getMetadata(e)])));
|
||||
await this.extensionsProfileScannerService.addExtensionsToProfile(extensions, extensionsProfileResource);
|
||||
}
|
||||
|
||||
async uninitialize(): Promise<void> {
|
||||
/* Remove the default extensions profile resource */
|
||||
try { await this.fileService.del(this.getDefaultExtensionsProfileResource()); } catch (error) { /* ignore */ }
|
||||
}
|
||||
|
||||
private getDefaultExtensionsProfileResource(): URI {
|
||||
return this.userDataProfilesService.defaultProfile.extensionsResource ?? joinPath(this.userDataProfilesService.defaultProfile.location, EXTENSIONS_RESOURCE_NAME);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user