mirror of
https://github.com/microsoft/vscode.git
synced 2026-09-26 18:06:43 +01:00
💄 extensions
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user