提交 2c29a9d9 编写于 作者: S Sandeep Somavarapu

Actions to open extension storage files

上级 5103b159
...@@ -61,7 +61,15 @@ ...@@ -61,7 +61,15 @@
{ {
"fileMatch": "/.vscode/extensions.json", "fileMatch": "/.vscode/extensions.json",
"url": "vscode://schemas/extensions" "url": "vscode://schemas/extensions"
},
{
"fileMatch": "%APP_SETTINGS_HOME%/extensions.json",
"url": "vscode://schemas/extensionsstorage"
},
{
"fileMatch": "%APP_SETTINGS_HOME%/**/extensions.json",
"url": "vscode://schemas/extensionsstorage"
} }
] ]
} }
} }
\ No newline at end of file
...@@ -20,7 +20,7 @@ import { IEditorRegistry, Extensions as EditorExtensions } from 'vs/workbench/co ...@@ -20,7 +20,7 @@ import { IEditorRegistry, Extensions as EditorExtensions } from 'vs/workbench/co
import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors';
import { VIEWLET_ID, IExtensionsWorkbenchService } from './extensions'; import { VIEWLET_ID, IExtensionsWorkbenchService } from './extensions';
import { ExtensionsWorkbenchService } from './extensionsWorkbenchService'; import { ExtensionsWorkbenchService } from './extensionsWorkbenchService';
import { OpenExtensionsViewletAction, InstallExtensionsAction, ShowOutdatedExtensionsAction, ShowRecommendedExtensionsAction, ShowWorkspaceRecommendedExtensionsAction, ShowPopularExtensionsAction, ShowInstalledExtensionsAction, UpdateAllAction, OpenExtensionsFolderAction, ConfigureWorkspaceRecommendedExtensionsAction, InstallVSIXAction } from './extensionsActions'; import { OpenExtensionsViewletAction, InstallExtensionsAction, ShowOutdatedExtensionsAction, ShowRecommendedExtensionsAction, ShowWorkspaceRecommendedExtensionsAction, ShowPopularExtensionsAction, ShowInstalledExtensionsAction, UpdateAllAction, OpenExtensionsFolderAction, ConfigureWorkspaceRecommendedExtensionsAction, OpenWorkspaceExtensionsStorageFile, OpenGlobalExtensionsStorageFile, InstallVSIXAction } from './extensionsActions';
import { ExtensionsInput } from './extensionsInput'; import { ExtensionsInput } from './extensionsInput';
import { ViewletRegistry, Extensions as ViewletExtensions, ViewletDescriptor } from 'vs/workbench/browser/viewlet'; import { ViewletRegistry, Extensions as ViewletExtensions, ViewletDescriptor } from 'vs/workbench/browser/viewlet';
import { ExtensionEditor } from './extensionEditor'; import { ExtensionEditor } from './extensionEditor';
...@@ -28,7 +28,7 @@ import { StatusUpdater } from './extensionsViewlet'; ...@@ -28,7 +28,7 @@ import { StatusUpdater } from './extensionsViewlet';
import { IQuickOpenRegistry, Extensions, QuickOpenHandlerDescriptor } from 'vs/workbench/browser/quickopen'; import { IQuickOpenRegistry, Extensions, QuickOpenHandlerDescriptor } from 'vs/workbench/browser/quickopen';
import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'vs/platform/configuration/common/configurationRegistry'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'vs/platform/configuration/common/configurationRegistry';
import jsonContributionRegistry = require('vs/platform/jsonschemas/common/jsonContributionRegistry'); import jsonContributionRegistry = require('vs/platform/jsonschemas/common/jsonContributionRegistry');
import { Schema, SchemaId } from 'vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate'; import { ExtensionsConfigurationSchema, ExtensionsConfigurationSchemaId, ExtensionsStorageSchema, ExtensionsStorageSchemaId } from 'vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate';
// Singletons // Singletons
registerSingleton(IExtensionGalleryService, ExtensionGalleryService); registerSingleton(IExtensionGalleryService, ExtensionGalleryService);
...@@ -119,6 +119,12 @@ actionRegistry.registerWorkbenchAction(openExtensionsFolderActionDescriptor, 'Ex ...@@ -119,6 +119,12 @@ actionRegistry.registerWorkbenchAction(openExtensionsFolderActionDescriptor, 'Ex
const openExtensionsFileActionDescriptor = new SyncActionDescriptor(ConfigureWorkspaceRecommendedExtensionsAction, ConfigureWorkspaceRecommendedExtensionsAction.ID, ConfigureWorkspaceRecommendedExtensionsAction.LABEL); const openExtensionsFileActionDescriptor = new SyncActionDescriptor(ConfigureWorkspaceRecommendedExtensionsAction, ConfigureWorkspaceRecommendedExtensionsAction.ID, ConfigureWorkspaceRecommendedExtensionsAction.LABEL);
actionRegistry.registerWorkbenchAction(openExtensionsFileActionDescriptor, 'Extensions: Open Extensions File', ExtensionsLabel); actionRegistry.registerWorkbenchAction(openExtensionsFileActionDescriptor, 'Extensions: Open Extensions File', ExtensionsLabel);
const disableExtensionsActionDescriptor = new SyncActionDescriptor(OpenGlobalExtensionsStorageFile, OpenGlobalExtensionsStorageFile.ID, localize('disableGlobalExtensions', "Disable Extensions"));
actionRegistry.registerWorkbenchAction(disableExtensionsActionDescriptor, 'Extensions: Disable Extensions', ExtensionsLabel);
const disableWorkspaceExtensionsActionDescriptor = new SyncActionDescriptor(OpenWorkspaceExtensionsStorageFile, OpenWorkspaceExtensionsStorageFile.ID, localize('disableWorkspaceExtensions', "Disable Extensions (Workspace)"));
actionRegistry.registerWorkbenchAction(disableWorkspaceExtensionsActionDescriptor, 'Extensions: Disable Extensions (Workspace)', ExtensionsLabel);
const installVSIXActionDescriptor = new SyncActionDescriptor(InstallVSIXAction, InstallVSIXAction.ID, InstallVSIXAction.LABEL); const installVSIXActionDescriptor = new SyncActionDescriptor(InstallVSIXAction, InstallVSIXAction.ID, InstallVSIXAction.LABEL);
actionRegistry.registerWorkbenchAction(installVSIXActionDescriptor, 'Extensions: Install from VSIX...', ExtensionsLabel); actionRegistry.registerWorkbenchAction(installVSIXActionDescriptor, 'Extensions: Install from VSIX...', ExtensionsLabel);
...@@ -138,4 +144,5 @@ Registry.as<IConfigurationRegistry>(ConfigurationExtensions.Configuration) ...@@ -138,4 +144,5 @@ Registry.as<IConfigurationRegistry>(ConfigurationExtensions.Configuration)
}); });
const jsonRegistry = <jsonContributionRegistry.IJSONContributionRegistry>Registry.as(jsonContributionRegistry.Extensions.JSONContribution); const jsonRegistry = <jsonContributionRegistry.IJSONContributionRegistry>Registry.as(jsonContributionRegistry.Extensions.JSONContribution);
jsonRegistry.registerSchema(SchemaId, Schema); jsonRegistry.registerSchema(ExtensionsConfigurationSchemaId, ExtensionsConfigurationSchema);
\ No newline at end of file jsonRegistry.registerSchema(ExtensionsStorageSchemaId, ExtensionsStorageSchema);
\ No newline at end of file
...@@ -14,6 +14,7 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; ...@@ -14,6 +14,7 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle';
import { ReloadWindowAction } from 'vs/workbench/electron-browser/actions'; import { ReloadWindowAction } from 'vs/workbench/electron-browser/actions';
import { IExtension, ExtensionState, IExtensionsWorkbenchService, VIEWLET_ID, IExtensionsViewlet, ConfigurationKey } from './extensions'; import { IExtension, ExtensionState, IExtensionsWorkbenchService, VIEWLET_ID, IExtensionsViewlet, ConfigurationKey } from './extensions';
import { LocalExtensionType } from 'vs/platform/extensionManagement/common/extensionManagement'; import { LocalExtensionType } from 'vs/platform/extensionManagement/common/extensionManagement';
import { IExtensionsRuntimeService } from 'vs/platform/extensions/common/extensions';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { IMessageService, LaterAction } from 'vs/platform/message/common/message'; import { IMessageService, LaterAction } from 'vs/platform/message/common/message';
import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IEnvironmentService } from 'vs/platform/environment/common/environment';
...@@ -22,10 +23,11 @@ import { IViewletService } from 'vs/workbench/services/viewlet/common/viewletSer ...@@ -22,10 +23,11 @@ import { IViewletService } from 'vs/workbench/services/viewlet/common/viewletSer
import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService';
import { Query } from '../common/extensionQuery'; import { Query } from '../common/extensionQuery';
import { shell, remote } from 'electron'; import { shell, remote } from 'electron';
import { InitialContent } from 'vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate'; import { ExtensionsConfigurationInitialContent, ExtensionStorageInitialContent } from 'vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate';
import { IFileService } from 'vs/platform/files/common/files'; import { IFileService } from 'vs/platform/files/common/files';
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
import URI from 'vs/base/common/uri'; import URI from 'vs/base/common/uri';
import { StorageScope } from 'vs/platform/storage/common/storage';
const dialog = remote.dialog; const dialog = remote.dialog;
...@@ -629,13 +631,87 @@ export class ConfigureWorkspaceRecommendedExtensionsAction extends Action { ...@@ -629,13 +631,87 @@ export class ConfigureWorkspaceRecommendedExtensionsAction extends Action {
return this.fileService.resolveContent(extensionsFileResource).then(content => { return this.fileService.resolveContent(extensionsFileResource).then(content => {
return { created: false, extensionsFileResource }; return { created: false, extensionsFileResource };
}, err => { }, err => {
return this.fileService.updateContent(extensionsFileResource, InitialContent).then(() => { return this.fileService.updateContent(extensionsFileResource, ExtensionsConfigurationInitialContent).then(() => {
return { created: true, extensionsFileResource }; return { created: true, extensionsFileResource };
}); });
}); });
} }
} }
export abstract class OpenExtensionsStorageFile extends Action {
constructor(
id: string,
label: string,
enabled: boolean,
private scope: StorageScope,
@IFileService private fileService: IFileService,
@IWorkbenchEditorService private editorService: IWorkbenchEditorService,
@IExtensionsRuntimeService private extensionsRuntimeService: IExtensionsRuntimeService
) {
super(id, label, null, enabled);
}
public run(event: any): TPromise<any> {
return this.openExtensionsStorageFile();
}
private openExtensionsStorageFile(): TPromise<any> {
return this.getOrCreateExtensionsFile().then(value => {
return this.editorService.openEditor({
resource: value.extensionsFileResource,
options: {
forceOpen: true,
pinned: value.created
},
});
}, (error) => TPromise.wrapError(new Error(localize('OpenGlobalExtensionsStorageFile.failed', "Unable to create 'extensions.json' file inside the '{0}' folder ({1}).", this.extensionsRuntimeService.getStoragePath(this.scope), error))));
}
private getOrCreateExtensionsFile(): TPromise<{ created: boolean, extensionsFileResource: URI }> {
const extensionsFileResource = URI.file(this.extensionsRuntimeService.getStoragePath(this.scope));
return this.fileService.resolveContent(extensionsFileResource).then(content => {
return { created: false, extensionsFileResource };
}, err => {
return this.fileService.updateContent(extensionsFileResource, ExtensionStorageInitialContent).then(() => {
return { created: true, extensionsFileResource };
});
});
}
}
export class OpenWorkspaceExtensionsStorageFile extends OpenExtensionsStorageFile {
static ID = 'workbench.extensions.action.openWorkspaceExtensionsStorageFile';
constructor(
id: string,
label: string,
@IFileService fileService: IFileService,
@IWorkspaceContextService contextService: IWorkspaceContextService,
@IWorkbenchEditorService editorService: IWorkbenchEditorService,
@IExtensionsRuntimeService extensionsRuntimeService: IExtensionsRuntimeService
) {
super(id, label, !!contextService.getWorkspace(), StorageScope.WORKSPACE, fileService, editorService, extensionsRuntimeService);
}
}
export class OpenGlobalExtensionsStorageFile extends OpenExtensionsStorageFile {
static ID = 'workbench.extensions.action.openGlobalExtensionsStorageFile';
constructor(
id: string,
label: string,
@IFileService fileService: IFileService,
@IWorkbenchEditorService editorService: IWorkbenchEditorService,
@IExtensionsRuntimeService extensionsRuntimeService: IExtensionsRuntimeService
) {
super(id, label, true, StorageScope.GLOBAL, fileService, editorService, extensionsRuntimeService);
}
}
export class InstallVSIXAction extends Action { export class InstallVSIXAction extends Action {
static ID = 'workbench.extensions.action.installVSIX'; static ID = 'workbench.extensions.action.installVSIX';
......
...@@ -7,9 +7,9 @@ import { localize } from 'vs/nls'; ...@@ -7,9 +7,9 @@ import { localize } from 'vs/nls';
import { IJSONSchema } from 'vs/base/common/jsonSchema'; import { IJSONSchema } from 'vs/base/common/jsonSchema';
import { EXTENSION_IDENTIFIER_PATTERN } from 'vs/platform/extensionManagement/common/extensionManagement'; import { EXTENSION_IDENTIFIER_PATTERN } from 'vs/platform/extensionManagement/common/extensionManagement';
export const SchemaId = 'vscode://schemas/extensions'; export const ExtensionsConfigurationSchemaId = 'vscode://schemas/extensions';
export const Schema: IJSONSchema = { export const ExtensionsConfigurationSchema: IJSONSchema = {
id: SchemaId, id: ExtensionsConfigurationSchemaId,
type: 'object', type: 'object',
title: localize('app.extensions.json.title', "Extensions"), title: localize('app.extensions.json.title', "Extensions"),
properties: { properties: {
...@@ -26,7 +26,7 @@ export const Schema: IJSONSchema = { ...@@ -26,7 +26,7 @@ export const Schema: IJSONSchema = {
} }
}; };
export const InitialContent: string = [ export const ExtensionsConfigurationInitialContent: string = [
'{', '{',
'\t// See http://go.microsoft.com/fwlink/?LinkId=827846', '\t// See http://go.microsoft.com/fwlink/?LinkId=827846',
'\t// for the documentation about the extensions.json format', '\t// for the documentation about the extensions.json format',
...@@ -35,4 +35,32 @@ export const InitialContent: string = [ ...@@ -35,4 +35,32 @@ export const InitialContent: string = [
'\t\t', '\t\t',
'\t]', '\t]',
'}' '}'
].join('\n');
export const ExtensionsStorageSchemaId = 'vscode://schemas/extensionsstorage';
export const ExtensionsStorageSchema: IJSONSchema = {
id: ExtensionsStorageSchemaId,
type: 'object',
title: localize('app.extensionsstorage.json.title', "Extensions Storage"),
properties: {
disabled: {
type: 'array',
description: localize('app.extensionsstorage.json.disabled', "List of disabled extensions. The identifier of an extension is always '${publisher}.${name}'. For example: 'vscode.csharp'."),
items: {
type: 'string',
defaultSnippets: [{ label: 'Example', body: 'vscode.csharp' }],
pattern: EXTENSION_IDENTIFIER_PATTERN,
errorMessage: localize('app.extension.identifier.errorMessage', "Expected format '${publisher}.${name}'. Example: 'vscode.csharp'.")
},
},
}
};
export const ExtensionStorageInitialContent: string = [
'{',
'\t"disabled": [',
'\t\t// Extension identifier format: ${publisher}.${name}. Example: vscode.csharp',
'\t\t',
'\t]',
'}'
].join('\n'); ].join('\n');
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册