From 4ef0081b7f2010602964fb07f7c466e23f5a1ebe Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 11 Oct 2016 18:23:04 +0200 Subject: [PATCH] Fix #13520 --- .../common/extensionManagement.ts | 7 +- .../electron-browser/extensionHost.ts | 94 ++++++++++++++++++- src/vs/workbench/node/extensionHostMain.ts | 54 +---------- 3 files changed, 102 insertions(+), 53 deletions(-) diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index f4f7320de84..a06aa217a43 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -234,4 +234,9 @@ export interface IExtensionTipsService { } export const ExtensionsLabel = nls.localize('extensions', "Extensions"); -export const ExtensionsChannelId = 'extensions'; \ No newline at end of file +export const ExtensionsChannelId = 'extensions'; + +export const ExtensionsStorageFile = 'extensions.json'; +export interface IExtensionsStorageData { + disabledExtensions?: string[]; +} \ No newline at end of file diff --git a/src/vs/workbench/electron-browser/extensionHost.ts b/src/vs/workbench/electron-browser/extensionHost.ts index abffec1b85a..ee47acfcec0 100644 --- a/src/vs/workbench/electron-browser/extensionHost.ts +++ b/src/vs/workbench/electron-browser/extensionHost.ts @@ -5,7 +5,10 @@ 'use strict'; +import * as fs from 'fs'; +import * as crypto from 'crypto'; import * as nls from 'vs/nls'; +import * as json from 'vs/base/common/json'; import pkg from 'vs/platform/package'; import paths = require('vs/base/common/paths'); import { toErrorMessage } from 'vs/base/common/errorMessage'; @@ -25,6 +28,7 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment' import { ReloadWindowAction } from 'vs/workbench/electron-browser/actions'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IExtensionDescription, IMessage } from 'vs/platform/extensions/common/extensions'; +import { IExtensionsStorageData, ExtensionsStorageFile } from 'vs/platform/extensionManagement/common/extensionManagement'; import { ExtensionScanner, MessagesCollector } from 'vs/workbench/node/extensionPoints'; import { IMessagePassingProtocol } from 'vs/base/parts/ipc/common/ipc'; import Event, { Emitter } from 'vs/base/common/event'; @@ -57,6 +61,8 @@ export class ExtensionHostProcessWorker { private isExtensionDevelopmentTestFromCli: boolean; private isExtensionDevelopmentDebugging: boolean; + private workspaceStoragePath: string; + private _onMessage = new Emitter(); public get onMessage(): Event { return this._onMessage.event; @@ -215,6 +221,7 @@ export class ExtensionHostProcessWorker { contextService: { workspace: this.contextService.getWorkspace() }, + workspaceStoragePath: this.getOrCreateWorkspaceStoragePath(), extensions: extensionDescriptors }); this.extensionHostProcessHandle.send(initPayload); @@ -225,7 +232,7 @@ export class ExtensionHostProcessWorker { const collector = new MessagesCollector(); const version = pkg.version; const builtinExtensions = ExtensionScanner.scanExtensions(version, collector, BUILTIN_EXTENSIONS_PATH, true); - const userExtensions = this.environmentService.disableExtensions || !this.environmentService.extensionsPath ? TPromise.as([]) : ExtensionScanner.scanExtensions(version, collector, this.environmentService.extensionsPath, false); + const userExtensions = this.environmentService.disableExtensions || !this.environmentService.extensionsPath ? TPromise.as([]) : this.getUserExtensions(version, collector); const developedExtensions = this.environmentService.disableExtensions || !this.environmentService.extensionDevelopmentPath ? TPromise.as([]) : ExtensionScanner.scanOneOrMultipleExtensions(version, collector, this.environmentService.extensionDevelopmentPath, false); const isDev = !this.environmentService.isBuilt || !!this.environmentService.extensionDevelopmentPath; @@ -262,6 +269,38 @@ export class ExtensionHostProcessWorker { }); } + private getUserExtensions(version: string, collector: MessagesCollector): TPromise { + return ExtensionScanner.scanExtensions(version, collector, this.environmentService.extensionsPath, false) + .then(extensionDescriptions => this.getDisabledExtensions() + .then(disabledExtensions => extensionDescriptions.filter(e => disabledExtensions.indexOf(`${e.publisher}.${e.name}`) === -1))); + } + + private getDisabledExtensions(): TPromise { + return this.getWorkspaceDisabledExtensions(); + } + + private getWorkspaceDisabledExtensions(): TPromise { + const workspaceStoragePath = this.getOrCreateWorkspaceStoragePath(); + if (!workspaceStoragePath) { + return TPromise.wrap([]); + } + + return new TPromise((c, e) => { + fs.readFile(paths.join(workspaceStoragePath, ExtensionsStorageFile), (error, raw) => { + let result = []; + if (!error) { + try { + const extensionsData: IExtensionsStorageData = json.parse(raw.toString()); + result = extensionsData.disabledExtensions || []; + } catch (error) { + // Ignore parsing errors + } + } + return c(result); + }); + }); + } + private logExtensionHostMessage(logEntry: ILogEntry) { let args = []; try { @@ -393,4 +432,57 @@ export class ExtensionHostProcessWorker { } } } + + private getOrCreateWorkspaceStoragePath(): string { + const workspace = this.contextService.getWorkspace(); + + if (!workspace) { + return void 0; + } + + if (this.workspaceStoragePath) { + return this.workspaceStoragePath; + } + + function rmkDir(directory: string): boolean { + try { + fs.mkdirSync(directory); + return true; + } catch (err) { + if (err.code === 'ENOENT') { + if (rmkDir(paths.dirname(directory))) { + fs.mkdirSync(directory); + return true; + } + } else { + return fs.statSync(directory).isDirectory(); + } + } + } + + if (workspace) { + const hash = crypto.createHash('md5'); + hash.update(workspace.resource.fsPath); + if (workspace.uid) { + hash.update(workspace.uid.toString()); + } + this.workspaceStoragePath = paths.join(this.environmentService.appSettingsHome, 'workspaceStorage', hash.digest('hex')); + if (!fs.existsSync(this.workspaceStoragePath)) { + try { + if (rmkDir(this.workspaceStoragePath)) { + fs.writeFileSync(paths.join(this.workspaceStoragePath, 'meta.json'), JSON.stringify({ + workspacePath: workspace.resource.fsPath, + uid: workspace.uid ? workspace.uid : null + }, null, 4)); + } else { + this.workspaceStoragePath = void 0; + } + } catch (err) { + this.workspaceStoragePath = void 0; + } + } + } + + return this.workspaceStoragePath; + } } \ No newline at end of file diff --git a/src/vs/workbench/node/extensionHostMain.ts b/src/vs/workbench/node/extensionHostMain.ts index 0540fffaf8b..5abbf8d2108 100644 --- a/src/vs/workbench/node/extensionHostMain.ts +++ b/src/vs/workbench/node/extensionHostMain.ts @@ -5,9 +5,6 @@ 'use strict'; -import * as fs from 'fs'; -import * as crypto from 'crypto'; - import nls = require('vs/nls'); import pfs = require('vs/base/node/pfs'); import { TPromise } from 'vs/base/common/winjs.base'; @@ -38,6 +35,7 @@ export interface IInitData { options: any; }; extensions: IExtensionDescription[]; + workspaceStoragePath: string; } const nativeExit = process.exit.bind(process); @@ -68,7 +66,8 @@ export class ExtensionHostMain { this._extensions = initData.extensions; this._contextService = new WorkspaceContextService(initData.contextService.workspace); - const workspaceStoragePath = this._getOrCreateWorkspaceStoragePath(); + const workspaceStoragePath = initData.workspaceStoragePath; + console.log(workspaceStoragePath); const threadService = new ExtHostThreadService(remoteCom); @@ -80,53 +79,6 @@ export class ExtensionHostMain { defineAPI(new ExtHostAPIImplementation(threadService, this._extensionService, this._contextService, telemetryService)); } - private _getOrCreateWorkspaceStoragePath(): string { - let workspaceStoragePath: string; - - const workspace = this._contextService.getWorkspace(); - - function rmkDir(directory: string): boolean { - try { - fs.mkdirSync(directory); - return true; - } catch (err) { - if (err.code === 'ENOENT') { - if (rmkDir(paths.dirname(directory))) { - fs.mkdirSync(directory); - return true; - } - } else { - return fs.statSync(directory).isDirectory(); - } - } - } - - if (workspace) { - const hash = crypto.createHash('md5'); - hash.update(workspace.resource.fsPath); - if (workspace.uid) { - hash.update(workspace.uid.toString()); - } - workspaceStoragePath = paths.join(this._environment.appSettingsHome, 'workspaceStorage', hash.digest('hex')); - if (!fs.existsSync(workspaceStoragePath)) { - try { - if (rmkDir(workspaceStoragePath)) { - fs.writeFileSync(paths.join(workspaceStoragePath, 'meta.json'), JSON.stringify({ - workspacePath: workspace.resource.fsPath, - uid: workspace.uid ? workspace.uid : null - }, null, 4)); - } else { - workspaceStoragePath = undefined; - } - } catch (err) { - workspaceStoragePath = undefined; - } - } - } - - return workspaceStoragePath; - } - public start(): TPromise { return this.registerExtensions(); } -- GitLab