提交 4ef0081b 编写于 作者: S Sandeep Somavarapu

Fix #13520

上级 34d582eb
......@@ -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
......@@ -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<any>();
public get onMessage(): Event<any> {
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<IExtensionDescription[]> {
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<string[]> {
return this.getWorkspaceDisabledExtensions();
}
private getWorkspaceDisabledExtensions(): TPromise<string[]> {
const workspaceStoragePath = this.getOrCreateWorkspaceStoragePath();
if (!workspaceStoragePath) {
return TPromise.wrap([]);
}
return new TPromise<string[]>((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
......@@ -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<void> {
return this.registerExtensions();
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册