diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts index dd69ab11336..edd599952a6 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts @@ -11,7 +11,7 @@ import {TPromise as Promise} from 'vs/base/common/winjs.base'; import {Action} from 'vs/base/common/actions'; import {match} from 'vs/base/common/glob'; import {IExtensionManagementService, IExtensionGalleryService, IExtensionTipsService} from 'vs/platform/extensionManagement/common/extensionManagement'; -import { IExtensionsConfiguration, EXTENSIONS_CONFIGURAION_NAME } from './extensions'; +import { IExtensionsConfiguration, ConfigurationKey } from './extensions'; import {IModelService} from 'vs/editor/common/services/modelService'; import {IStorageService, StorageScope} from 'vs/platform/storage/common/storage'; import product from 'vs/platform/product'; @@ -49,8 +49,8 @@ export class ExtensionTipsService implements IExtensionTipsService { } getWorkspaceRecommendations(): string[] { - let configuration = this.configurationService.getConfiguration(EXTENSIONS_CONFIGURAION_NAME); - return configuration.recommendations ? configuration.recommendations : []; + const configuration = this.configurationService.getConfiguration(ConfigurationKey); + return configuration.recommendations || []; } getRecommendations(): string[] { diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensions.ts b/src/vs/workbench/parts/extensions/electron-browser/extensions.ts index d2a89d7b136..fa0f4a16430 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensions.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensions.ts @@ -60,10 +60,9 @@ export interface IExtensionsWorkbenchService { install(vsix: string): TPromise; install(extension: IExtension): TPromise; uninstall(extension: IExtension): TPromise; - openExtensionsFile(sideBySide?: boolean): TPromise; } -export const EXTENSIONS_CONFIGURAION_NAME = 'extensions'; +export const ConfigurationKey = 'extensions'; export interface IExtensionsConfiguration { autoUpdate: boolean; diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts index cc8992fd2b6..19fefb00ccf 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts @@ -12,7 +12,7 @@ import paths = require('vs/base/common/paths'); import Event from 'vs/base/common/event'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { ReloadWindowAction } from 'vs/workbench/electron-browser/actions'; -import { IExtension, ExtensionState, IExtensionsWorkbenchService, VIEWLET_ID, IExtensionsViewlet } from './extensions'; +import { IExtension, ExtensionState, IExtensionsWorkbenchService, VIEWLET_ID, IExtensionsViewlet, ConfigurationKey } from './extensions'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IMessageService, LaterAction } from 'vs/platform/message/common/message'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; @@ -21,6 +21,10 @@ import { IViewletService } from 'vs/workbench/services/viewlet/common/viewletSer import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { Query } from '../common/extensionQuery'; import { shell, remote } from 'electron'; +import { InitialContent } from 'vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate'; +import { IFileService } from 'vs/platform/files/common/files'; +import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import URI from 'vs/base/common/uri'; const dialog = remote.dialog; @@ -557,15 +561,53 @@ export class OpenExtensionsFolderAction extends Action { } export class ConfigureWorkspaceRecommendedExtensionsAction extends Action { + static ID = 'workbench.extensions.action.configureWorkspaceRecommendedExtensions'; static LABEL = localize('configureWorkspaceRecommendedExtensions', "Configure Workspace Recommended Extensions"); - constructor(id: string, label: string, @IExtensionsWorkbenchService private extensionsService: IExtensionsWorkbenchService) { + constructor( + id: string, + label: string, + @IFileService private fileService: IFileService, + @IWorkspaceContextService private contextService: IWorkspaceContextService, + @IExtensionsWorkbenchService private extensionsService: IExtensionsWorkbenchService, + @IWorkbenchEditorService private editorService: IWorkbenchEditorService, + @IMessageService private messageService: IMessageService + ) { super(id, label, null, true); } public run(event: any): TPromise { - return this.extensionsService.openExtensionsFile(); + return this.openExtensionsFile(); + } + + private openExtensionsFile(): TPromise { + if (!this.contextService.getWorkspace()) { + this.messageService.show(severity.Info, localize('ConfigureWorkspaceRecommendations.noWorkspace', 'Recommendations are only available on a workspace folder.')); + return TPromise.as(undefined); + } + + return this.getOrCreateExtensionsFile().then(value => { + return this.editorService.openEditor({ + resource: value.extensionsFileResource, + options: { + forceOpen: true, + pinned: value.created + }, + }); + }, (error) => TPromise.wrapError(new Error(localize('OpenExtensionsFile.failed', "Unable to create 'extensions.json' file inside the '.vscode' folder ({0}).", error)))); + } + + private getOrCreateExtensionsFile(): TPromise<{ created: boolean, extensionsFileResource: URI }> { + const extensionsFileResource = URI.file(paths.join(this.contextService.getWorkspace().resource.fsPath, '.vscode', `${ ConfigurationKey }.json`)); + + return this.fileService.resolveContent(extensionsFileResource).then(content => { + return { created: false, extensionsFileResource }; + }, err => { + return this.fileService.updateContent(extensionsFileResource, InitialContent).then(() => { + return { created: true, extensionsFileResource }; + }); + }); } } diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.ts index ca20cc34292..fa07ec93d02 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate.ts @@ -22,7 +22,7 @@ export const Schema: IJSONSchema = { } }; -export const Content: string = [ +export const InitialContent: string = [ '{', '\t// See http://go.microsoft.com/fwlink/?LinkId=827846', '\t// for the documentation about the extensions.json format', diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts index 771f330c530..d5d70fb19f9 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts @@ -7,7 +7,6 @@ import 'vs/css!./media/extensionsViewlet'; import { localize } from 'vs/nls'; -import paths = require('vs/base/common/paths'); import Event, { Emitter, chain } from 'vs/base/common/event'; import { index } from 'vs/base/common/arrays'; import { assign } from 'vs/base/common/objects'; @@ -24,18 +23,15 @@ import { getGalleryExtensionTelemetryData, getLocalExtensionTelemetryData } from import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IMessageService } from 'vs/platform/message/common/message'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import Severity from 'vs/base/common/severity'; import * as semver from 'semver'; import * as path from 'path'; import URI from 'vs/base/common/uri'; import { readFile } from 'vs/base/node/pfs'; import { asText } from 'vs/base/node/request'; -import { IExtension, ExtensionState, IExtensionsWorkbenchService, IExtensionsConfiguration, EXTENSIONS_CONFIGURAION_NAME } from './extensions'; +import { IExtension, ExtensionState, IExtensionsWorkbenchService, IExtensionsConfiguration, ConfigurationKey } from './extensions'; import { UpdateAllAction } from './extensionsActions'; -import { IFileService } from 'vs/platform/files/common/files'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { Content } from 'vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate'; import { ReloadWindowAction } from 'vs/workbench/electron-browser/actions'; import { IURLService } from 'vs/platform/url/common/url'; import { ExtensionsInput } from './extensionsInput'; @@ -261,8 +257,6 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService { constructor( @IInstantiationService private instantiationService: IInstantiationService, - @IWorkspaceContextService private contextService: IWorkspaceContextService, - @IFileService private fileService: IFileService, @IWorkbenchEditorService private editorService: IWorkbenchEditorService, @IExtensionManagementService private extensionService: IExtensionManagementService, @IExtensionGalleryService private galleryService: IExtensionGalleryService, @@ -355,7 +349,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService { } return this.queryGallery({ ids, pageSize: ids.length }).then(() => { - const config = this.configurationService.getConfiguration(EXTENSIONS_CONFIGURAION_NAME); + const config = this.configurationService.getConfiguration(ConfigurationKey); if (!config.autoUpdate) { return; @@ -560,36 +554,6 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService { .done(null, err => this.onError(err)); } - openExtensionsFile(sideBySide?: boolean): TPromise { - if (!this.contextService.getWorkspace()) { - this.messageService.show(Severity.Info, localize('ConfigureWorkspaceRecommendations.noWorkspace', 'Recommendations are only available on a workspace folder.')); - return TPromise.as(undefined); - } - - return this.getOrCreateExtensionsFile().then(value => { - return this.editorService.openEditor({ - resource: value.extensionsFileResource, - options: { - forceOpen: true, - pinned: value.created - }, - }, sideBySide); - }, (error) => { - throw new Error(localize('OpenExtensionsFile.failed', "Unable to create 'extensions.json' file inside the '.vscode' folder ({0}).", error)); - }); - } - - private getOrCreateExtensionsFile(): TPromise<{ created: boolean, extensionsFileResource: URI }> { - let extensionsFileResource = URI.file(paths.join(this.contextService.getWorkspace().resource.fsPath, '/.vscode/' + EXTENSIONS_CONFIGURAION_NAME + '.json')); - return this.fileService.resolveContent(extensionsFileResource).then(content => { - return { created: false, extensionsFileResource }; - }, err => { - return this.fileService.updateContent(extensionsFileResource, Content).then(() => { - return { created: true, extensionsFileResource }; - }); - }); - } - dispose(): void { this.disposables = dispose(this.disposables); }