diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index 12243f5f237fc5cc285333d0d48f380c335a2fe9..3f6e9a49fbed0306c24041e3a74e62f2aed46028 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -122,6 +122,7 @@ export interface IExtensionManifest { main?: string; icon?: string; categories?: string[]; + keywords?: string[]; activationEvents?: string[]; extensionDependencies?: string[]; extensionPack?: string[]; diff --git a/src/vs/platform/extensionManagement/common/extensionManagementUtil.ts b/src/vs/platform/extensionManagement/common/extensionManagementUtil.ts index 208631c7b63b46de82673641891760d5b09e8ffa..0f626331d1d82aeeedb88ce4fbf26119f53ff720 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagementUtil.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagementUtil.ts @@ -6,6 +6,7 @@ 'use strict'; import { ILocalExtension, IGalleryExtension, EXTENSION_IDENTIFIER_REGEX, IExtensionIdentifier, IReportedExtension, IExtensionManifest } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; export function areSameExtensions(a: IExtensionIdentifier, b: IExtensionIdentifier): boolean { if (a.uuid && b.uuid) { @@ -119,9 +120,22 @@ export function getMaliciousExtensionsSet(report: IReportedExtension[]): Set('_workbench.workspaceExtensions') || []; + if (workspaceExtensions.length) { + if (workspaceExtensions.indexOf(extensionId) !== -1) { + return true; + } + if (workspaceExtensions.indexOf(`-${extensionId}`) !== -1) { + return false; + } + } + if (manifest.main) { - const extensionId = getGalleryExtensionId(manifest.publisher, manifest.name); + if ((manifest.keywords || []).indexOf('capability_fs') !== -1) { + return true; + } return [ 'vscode.extension-editing', 'vscode.configuration-editing', diff --git a/src/vs/platform/extensionManagement/common/multiExtensionManagement.ts b/src/vs/platform/extensionManagement/common/multiExtensionManagement.ts index 034d60be81658ae523c8856b8e23fb999b11d925..852ccee6bfcc3a287f7ca4cdf06359a677166795 100644 --- a/src/vs/platform/extensionManagement/common/multiExtensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/multiExtensionManagement.ts @@ -18,6 +18,7 @@ import { IWindowService } from 'vs/platform/windows/common/windows'; import { Action } from 'vs/base/common/actions'; import { ILogService } from 'vs/platform/log/common/log'; import { Disposable } from 'vs/base/common/lifecycle'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; export class MulitExtensionManagementService extends Disposable implements IExtensionManagementService { @@ -37,7 +38,8 @@ export class MulitExtensionManagementService extends Disposable implements IExte @INotificationService private notificationService: INotificationService, @IWindowService private windowService: IWindowService, @ILogService private logService: ILogService, - @IExtensionGalleryService private extensionGalleryService: IExtensionGalleryService + @IExtensionGalleryService private extensionGalleryService: IExtensionGalleryService, + @IConfigurationService private configurationService: IConfigurationService ) { super(); this.servers = this.extensionManagementServerService.extensionManagementServers; @@ -84,7 +86,7 @@ export class MulitExtensionManagementService extends Disposable implements IExte .then(extensionIdentifer => this.localServer.extensionManagementService.getInstalled(LocalExtensionType.User) .then(installed => { const extension = installed.filter(i => areSameExtensions(i.identifier, extensionIdentifer))[0]; - if (extension && isWorkspaceExtension(extension.manifest)) { + if (this.otherServers.length && extension && isWorkspaceExtension(extension.manifest, this.configurationService)) { return TPromise.join(this.otherServers.map(server => server.extensionManagementService.install(vsix))) .then(() => extensionIdentifer); } @@ -98,7 +100,7 @@ export class MulitExtensionManagementService extends Disposable implements IExte } return this.extensionGalleryService.getManifest(gallery) .then(manifest => { - const servers = isWorkspaceExtension(manifest) ? this.servers : [this.localServer]; + const servers = isWorkspaceExtension(manifest, this.configurationService) ? this.servers : [this.localServer]; return TPromise.join(servers.map(server => server.extensionManagementService.installFromGallery(gallery))) .then(() => null); }); @@ -115,7 +117,7 @@ export class MulitExtensionManagementService extends Disposable implements IExte private async syncExtensions(): Promise { this.localServer.extensionManagementService.getInstalled(LocalExtensionType.User) .then(async localExtensions => { - const workspaceExtensions = localExtensions.filter(e => isWorkspaceExtension(e.manifest)); + const workspaceExtensions = localExtensions.filter(e => isWorkspaceExtension(e.manifest, this.configurationService)); const extensionsToSync: Map = await this.getExtensionsToSync(workspaceExtensions); if (extensionsToSync.size > 0) { const handler = this.notificationService.notify({ severity: Severity.Info, message: localize('synchronising', "Synchronising workspace extensions...") });