mirror of
https://github.com/microsoft/vscode.git
synced 2026-04-26 11:38:51 +01:00
#13357 Move extensions scanning to renderer
This commit is contained in:
@@ -10,10 +10,8 @@ import * as crypto from 'crypto';
|
||||
|
||||
import nls = require('vs/nls');
|
||||
import pfs = require('vs/base/node/pfs');
|
||||
import URI from 'vs/base/common/uri';
|
||||
import { TPromise } from 'vs/base/common/winjs.base';
|
||||
import paths = require('vs/base/common/paths');
|
||||
import pkg from 'vs/platform/package';
|
||||
import { IExtensionDescription } from 'vs/platform/extensions/common/extensions';
|
||||
import { ExtensionsRegistry } from 'vs/platform/extensions/common/extensionsRegistry';
|
||||
import { ExtHostAPIImplementation, defineAPI } from 'vs/workbench/api/node/extHost.api.impl';
|
||||
@@ -21,14 +19,9 @@ import { IMainProcessExtHostIPC } from 'vs/platform/extensions/common/ipcRemoteC
|
||||
import { ExtHostExtensionService } from 'vs/workbench/api/node/extHostExtensionService';
|
||||
import { ExtHostThreadService } from 'vs/workbench/services/thread/common/extHostThreadService';
|
||||
import { RemoteTelemetryService } from 'vs/workbench/api/node/extHostTelemetry';
|
||||
import { ExtensionScanner, MessagesCollector } from 'vs/workbench/node/extensionPoints';
|
||||
import { IWorkspaceContextService, WorkspaceContextService } from 'vs/platform/workspace/common/workspace';
|
||||
import * as errors from 'vs/base/common/errors';
|
||||
|
||||
const DIRNAME = URI.parse(require.toUrl('./')).fsPath;
|
||||
const BASE_PATH = paths.normalize(paths.join(DIRNAME, '../../../..'));
|
||||
const BUILTIN_EXTENSIONS_PATH = paths.join(BASE_PATH, 'extensions');
|
||||
|
||||
export interface IEnvironment {
|
||||
appSettingsHome: string;
|
||||
disableExtensions: boolean;
|
||||
@@ -44,6 +37,7 @@ export interface IInitData {
|
||||
workspace: any;
|
||||
options: any;
|
||||
};
|
||||
extensions: IExtensionDescription[];
|
||||
}
|
||||
|
||||
const nativeExit = process.exit.bind(process);
|
||||
@@ -65,11 +59,13 @@ export class ExtensionHostMain {
|
||||
private _contextService: IWorkspaceContextService;
|
||||
private _environment: IEnvironment;
|
||||
private _extensionService: ExtHostExtensionService;
|
||||
private _extensions: IExtensionDescription[];
|
||||
|
||||
constructor(remoteCom: IMainProcessExtHostIPC, initData: IInitData) {
|
||||
this._isTerminating = false;
|
||||
|
||||
this._environment = initData.environment;
|
||||
this._extensions = initData.extensions;
|
||||
|
||||
this._contextService = new WorkspaceContextService(initData.contextService.workspace);
|
||||
const workspaceStoragePath = this._getOrCreateWorkspaceStoragePath();
|
||||
@@ -80,16 +76,6 @@ export class ExtensionHostMain {
|
||||
|
||||
this._extensionService = new ExtHostExtensionService(threadService, telemetryService, { _serviceBrand: 'optionalArgs', workspaceStoragePath });
|
||||
|
||||
// Connect to shared process services
|
||||
/*
|
||||
const channel = sharedProcessClient.getChannel<IExtensionManagementChannel>('extensions');
|
||||
const extensionsService = new ExtensionManagementChannelClient(channel);
|
||||
if (false && false) {
|
||||
// TODO: what to do with the ExtensionManagementChannelClient?
|
||||
console.log(extensionsService);
|
||||
}
|
||||
*/
|
||||
|
||||
// Create the ext host API
|
||||
defineAPI(new ExtHostAPIImplementation(threadService, this._extensionService, this._contextService, telemetryService));
|
||||
}
|
||||
@@ -142,7 +128,7 @@ export class ExtensionHostMain {
|
||||
}
|
||||
|
||||
public start(): TPromise<void> {
|
||||
return this.readExtensions();
|
||||
return this.registerExtensions();
|
||||
}
|
||||
|
||||
public terminate(): void {
|
||||
@@ -177,53 +163,10 @@ export class ExtensionHostMain {
|
||||
}, 1000);
|
||||
}
|
||||
|
||||
private readExtensions(): TPromise<void> {
|
||||
let collector = new MessagesCollector();
|
||||
|
||||
return ExtensionHostMain.scanExtensions(collector, BUILTIN_EXTENSIONS_PATH, !this._environment.disableExtensions ? this._environment.userExtensionsHome : void 0, !this._environment.disableExtensions ? this._environment.extensionDevelopmentPath : void 0, pkg.version)
|
||||
.then(null, err => {
|
||||
collector.error('', err);
|
||||
return [];
|
||||
})
|
||||
.then(extensions => {
|
||||
// Register & Signal done
|
||||
ExtensionsRegistry.registerExtensions(extensions);
|
||||
this._extensionService.registrationDone(collector.getMessages());
|
||||
})
|
||||
.then(() => this.handleEagerExtensions())
|
||||
.then(() => this.handleExtensionTests());
|
||||
}
|
||||
|
||||
private static scanExtensions(collector: MessagesCollector, builtinExtensionsPath: string, userInstallPath: string, extensionDevelopmentPath: string, version: string): TPromise<IExtensionDescription[]> {
|
||||
const builtinExtensions = ExtensionScanner.scanExtensions(version, collector, builtinExtensionsPath, true);
|
||||
const userExtensions = !userInstallPath ? TPromise.as([]) : ExtensionScanner.scanExtensions(version, collector, userInstallPath, false);
|
||||
const developedExtensions = !extensionDevelopmentPath ? TPromise.as([]) : ExtensionScanner.scanOneOrMultipleExtensions(version, collector, extensionDevelopmentPath, false);
|
||||
|
||||
return TPromise.join([builtinExtensions, userExtensions, developedExtensions]).then((_: IExtensionDescription[][]) => {
|
||||
let builtinExtensions = _[0];
|
||||
let userExtensions = _[1];
|
||||
let developedExtensions = _[2];
|
||||
|
||||
let result: { [extensionId: string]: IExtensionDescription; } = {};
|
||||
builtinExtensions.forEach((builtinExtension) => {
|
||||
result[builtinExtension.id] = builtinExtension;
|
||||
});
|
||||
userExtensions.forEach((userExtension) => {
|
||||
if (result.hasOwnProperty(userExtension.id)) {
|
||||
collector.warn(userExtension.extensionFolderPath, nls.localize('overwritingExtension', "Overwriting extension {0} with {1}.", result[userExtension.id].extensionFolderPath, userExtension.extensionFolderPath));
|
||||
}
|
||||
result[userExtension.id] = userExtension;
|
||||
});
|
||||
developedExtensions.forEach(developedExtension => {
|
||||
collector.info('', nls.localize('extensionUnderDevelopment', "Loading development extension at {0}", developedExtension.extensionFolderPath));
|
||||
if (result.hasOwnProperty(developedExtension.id)) {
|
||||
collector.warn(developedExtension.extensionFolderPath, nls.localize('overwritingExtension', "Overwriting extension {0} with {1}.", result[developedExtension.id].extensionFolderPath, developedExtension.extensionFolderPath));
|
||||
}
|
||||
result[developedExtension.id] = developedExtension;
|
||||
});
|
||||
|
||||
return Object.keys(result).map(name => result[name]);
|
||||
});
|
||||
private registerExtensions(): TPromise<void> {
|
||||
ExtensionsRegistry.registerExtensions(this._extensions);
|
||||
this._extensionService.registrationDone([]);
|
||||
return this.handleEagerExtensions().then(() => this.handleExtensionTests());
|
||||
}
|
||||
|
||||
// Handle "eager" activation extensions
|
||||
|
||||
Reference in New Issue
Block a user