💄 extensions

This commit is contained in:
Joao Moreno
2016-09-16 11:06:14 +02:00
parent 340f4590cc
commit 52f57fa587
5 changed files with 52 additions and 47 deletions
@@ -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<IExtensionsConfiguration>(EXTENSIONS_CONFIGURAION_NAME);
return configuration.recommendations ? configuration.recommendations : [];
const configuration = this.configurationService.getConfiguration<IExtensionsConfiguration>(ConfigurationKey);
return configuration.recommendations || [];
}
getRecommendations(): string[] {
@@ -60,10 +60,9 @@ export interface IExtensionsWorkbenchService {
install(vsix: string): TPromise<void>;
install(extension: IExtension): TPromise<void>;
uninstall(extension: IExtension): TPromise<void>;
openExtensionsFile(sideBySide?: boolean): TPromise<void>;
}
export const EXTENSIONS_CONFIGURAION_NAME = 'extensions';
export const ConfigurationKey = 'extensions';
export interface IExtensionsConfiguration {
autoUpdate: boolean;
@@ -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<any> {
return this.extensionsService.openExtensionsFile();
return this.openExtensionsFile();
}
private openExtensionsFile(): TPromise<any> {
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 };
});
});
}
}
@@ -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',
@@ -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<IExtensionsConfiguration>(EXTENSIONS_CONFIGURAION_NAME);
const config = this.configurationService.getConfiguration<IExtensionsConfiguration>(ConfigurationKey);
if (!config.autoUpdate) {
return;
@@ -560,36 +554,6 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService {
.done(null, err => this.onError(err));
}
openExtensionsFile(sideBySide?: boolean): TPromise<any> {
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);
}