From 4c8410c1a13bcd86e0c3e5261be39e7b0defea94 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 16 Jun 2016 19:08:42 +0200 Subject: [PATCH] extension.manifest --- src/vs/code/node/cliProcessMain.ts | 13 +++--- .../common/extensionManagement.ts | 3 +- .../node/extensionManagementService.ts | 44 +++++++++---------- .../node/extensionManagementUtil.ts | 10 ++--- .../electron-browser/extensionsActions.ts | 26 ++++++----- 5 files changed, 48 insertions(+), 48 deletions(-) diff --git a/src/vs/code/node/cliProcessMain.ts b/src/vs/code/node/cliProcessMain.ts index 646e564e72f..f3cb2d252de 100644 --- a/src/vs/code/node/cliProcessMain.ts +++ b/src/vs/code/node/cliProcessMain.ts @@ -17,8 +17,7 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment' import { EnvironmentService } from 'vs/platform/environment/node/environmentService'; import { IEventService } from 'vs/platform/event/common/event'; import { EventService } from 'vs/platform/event/common/eventService'; -import { IExtensionManagementService, IExtensionGalleryService, IQueryResult } from 'vs/platform/extensionManagement/common/extensionManagement'; -import { getExtensionId } from 'vs/platform/extensionManagement/node/extensionManagementUtil'; +import { IExtensionManagementService, IExtensionGalleryService, IQueryResult, IExtensionManifest } from 'vs/platform/extensionManagement/common/extensionManagement'; import { ExtensionManagementService } from 'vs/platform/extensionManagement/node/extensionManagementService'; import { ExtensionGalleryService } from 'vs/platform/extensionManagement/node/extensionGalleryService'; import { ITelemetryService, combinedAppender, NullTelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -34,6 +33,10 @@ const notFound = id => localize('notFound', "Extension '{0}' not found.", id); const notInstalled = id => localize('notInstalled', "Extension '{0}' is not installed.", id); const useId = localize('useId', "Make sure you use the full extension ID, eg: {0}", 'ms-vscode.csharp'); +function getId(manifest: IExtensionManifest): string { + return `${ manifest.publisher }.${ manifest.name }`; +} + class Main { constructor( @@ -59,14 +62,14 @@ class Main { private listExtensions(): TPromise { return this.extensionManagementService.getInstalled().then(extensions => { - extensions.forEach(e => console.log(getExtensionId(e))); + extensions.forEach(e => console.log(getId(e.manifest))); }); } private installExtension(ids: string[]): TPromise { return sequence(ids.map(id => () => { return this.extensionManagementService.getInstalled().then(installed => { - const isInstalled = installed.some(e => getExtensionId(e) === id); + const isInstalled = installed.some(e => getId(e.manifest) === id); if (isInstalled) { console.log(localize('alreadyInstalled', "Extension '{0}' is already installed.", id)); @@ -105,7 +108,7 @@ class Main { private uninstallExtension(ids: string[]): TPromise { return sequence(ids.map(id => () => { return this.extensionManagementService.getInstalled().then(installed => { - const [extension] = installed.filter(e => getExtensionId(e) === id); + const [extension] = installed.filter(e => getId(e.manifest) === id); if (!extension) { return TPromise.wrapError(`${ notInstalled(id) }\n${ useId }`); diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index d7e1c8df709..fc6717618eb 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -39,7 +39,8 @@ export interface IGalleryMetadata { versions: IGalleryVersion[]; } -export interface IExtension extends IExtensionManifest { +export interface IExtension { + manifest: IExtensionManifest; path?: string; } diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index 64a8412a066..c3cca95c29b 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -38,7 +38,7 @@ function parseManifest(raw: string): TPromise { }); } -function validate(zipPath: string, extension?: IExtension, version = extension && extension.version): TPromise { +function validate(zipPath: string, extension?: IExtensionManifest, version = extension && extension.version): TPromise { return buffer(zipPath, 'extension/package.json') .then(buffer => parseManifest(buffer.toString('utf8'))) .then(manifest => { @@ -61,14 +61,7 @@ function validate(zipPath: string, extension?: IExtension, version = extension & } function createExtension(manifest: IExtensionManifest, path?: string): IExtension { - const extension: IExtension = { - name: manifest.name, - displayName: manifest.displayName || manifest.name, - publisher: manifest.publisher, - version: manifest.version, - engines: { vscode: manifest.engines.vscode }, - description: manifest.description || '' - }; + const extension: IExtension = { manifest }; // if (galleryInformation) { // extension.galleryInformation = galleryInformation; @@ -133,10 +126,12 @@ export class ExtensionManagementService implements IExtensionManagementService { return this.installFromZip(arg); } - const extension = arg as IExtension; + const extension = arg as IGalleryExtension; + const { manifest } = extension; + return this.isObsolete(extension).then(obsolete => { if (obsolete) { - return TPromise.wrapError(new Error(nls.localize('restartCode', "Please restart Code before reinstalling {0}.", extension.name))); + return TPromise.wrapError(new Error(nls.localize('restartCode', "Please restart Code before reinstalling {0}.", manifest.name))); } return this.installFromGallery(arg); @@ -206,8 +201,9 @@ export class ExtensionManagementService implements IExtensionManagementService { } uninstall(extension: IExtension): TPromise { - const extensionPath = extension.path || path.join(this.extensionsPath, getExtensionId(extension)); - const id = getExtensionId(extension); + const { manifest } = extension; + const id = getExtensionId(manifest); + const extensionPath = extension.path || path.join(this.extensionsPath, id); return pfs.exists(extensionPath) .then(exists => exists ? null : Promise.wrapError(new Error(nls.localize('notExists', "Could not find extension")))) @@ -226,8 +222,8 @@ export class ExtensionManagementService implements IExtensionManagementService { } return all.then(extensions => { - const byId = values(groupBy(extensions, p => `${ p.publisher }.${ p.name }`)); - return byId.map(p => p.sort((a, b) => semver.rcompare(a.version, b.version))[0]); + const byId = values(groupBy(extensions, p => `${ p.manifest.publisher }.${ p.manifest.name }`)); + return byId.map(p => p.sort((a, b) => semver.rcompare(a.manifest.version, b.manifest.version))[0]); }); } @@ -254,7 +250,7 @@ export class ExtensionManagementService implements IExtensionManagementService { removeDeprecatedExtensions(): TPromise { const outdated = this.getOutdatedExtensions() - .then(extensions => extensions.map(e => getExtensionId(e))); + .then(extensions => extensions.map(({ manifest }) => getExtensionId(manifest))); const obsolete = this.getObsoleteExtensions() .then(obsolete => Object.keys(obsolete)); @@ -271,26 +267,26 @@ export class ExtensionManagementService implements IExtensionManagementService { private getOutdatedExtensions(): TPromise { return this.getAllInstalled().then(plugins => { - const byId = values(groupBy(plugins, p => `${ p.publisher }.${ p.name }`)); - const extensions = flatten(byId.map(p => p.sort((a, b) => semver.rcompare(a.version, b.version)).slice(1))); + const byId = values(groupBy(plugins, p => `${ p.manifest.publisher }.${ p.manifest.name }`)); + const extensions = flatten(byId.map(p => p.sort((a, b) => semver.rcompare(a.manifest.version, b.manifest.version)).slice(1))); return extensions .filter(e => !!e.path); }); } - private isObsolete(extension: IExtension): TPromise { - const id = getExtensionId(extension); + private isObsolete({ manifest }: IExtension): TPromise { + const id = getExtensionId(manifest); return this.withObsoleteExtensions(obsolete => !!obsolete[id]); } - private setObsolete(extension: IExtension): TPromise { - const id = getExtensionId(extension); + private setObsolete({ manifest }: IExtension): TPromise { + const id = getExtensionId(manifest); return this.withObsoleteExtensions(obsolete => assign(obsolete, { [id]: true })); } - private unsetObsolete(extension: IExtension): TPromise { - const id = getExtensionId(extension); + private unsetObsolete({ manifest }: IExtension): TPromise { + const id = getExtensionId(manifest); return this.withObsoleteExtensions(obsolete => delete obsolete[id]); } diff --git a/src/vs/platform/extensionManagement/node/extensionManagementUtil.ts b/src/vs/platform/extensionManagement/node/extensionManagementUtil.ts index 8d2fd813572..5ec8ff29733 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementUtil.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementUtil.ts @@ -9,10 +9,6 @@ import { IExtension, IExtensionManifest, IExtensionManagementService, IExtension import { TPromise } from 'vs/base/common/winjs.base'; import * as semver from 'semver'; -export function getExtensionId(extension: IExtension): string { - return `${ extension.publisher }.${ extension.name }`; -} - export function extensionEquals(one: IExtensionManifest, other: IExtensionManifest): boolean { return one.publisher === other.publisher && one.name === other.name; } @@ -36,14 +32,14 @@ export function getOutdatedExtensions(extensionsService: IExtensionManagementSer } return extensionsService.getInstalled().then(installed => { - const ids = installed.map(getExtensionId); + const ids = installed.map(({ manifest }) => `${ manifest.publisher }.${ manifest.name }`); return galleryService.query({ ids, pageSize: 1000 }).then(result => { const available = result.firstPage; return available.map(extension => { - const local = installed.filter(local => extensionEquals(local, extension.manifest))[0]; - if (local && semver.lt(local.version, extension.manifest.version)) { + const local = installed.filter(local => extensionEquals(local.manifest, extension.manifest))[0]; + if (local && semver.lt(local.manifest.version, extension.manifest.version)) { return local; } else { return null; diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts index 0b3c6c1985b..1614289b351 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts @@ -32,7 +32,7 @@ export class ListExtensionsAction extends Action { super(id, label, null, true); } - public run(): Promise { + run(): Promise { return this.quickOpenService.show('ext '); } @@ -55,7 +55,7 @@ export class InstallExtensionAction extends Action { super(id, label, null, true); } - public run(): Promise { + run(): Promise { return this.quickOpenService.show('ext install '); } @@ -78,7 +78,7 @@ export class ListOutdatedExtensionsAction extends Action { super(id, label, null, true); } - public run(): Promise { + run(): Promise { return this.quickOpenService.show('ext update '); } @@ -101,7 +101,7 @@ export class ListSuggestedExtensionsAction extends Action { super(id, label, null, true); } - public run(): Promise { + run(): Promise { return this.quickOpenService.show('ext recommend '); } @@ -123,11 +123,11 @@ export class InstallAction extends Action { super('extensions.install', label, 'octicon octicon-cloud-download', true); } - public run(extension: IGalleryExtension): TPromise { + run(extension: IGalleryExtension): TPromise { this.enabled = false; return this.extensionManagementService.getInstalled() - .then(installed => installed.some(e => extensionEquals(e, extension.manifest))) + .then(installed => installed.some(({ manifest }) => extensionEquals(manifest, extension.manifest))) .then(isUpdate => { return this.extensionManagementService .install(extension) @@ -173,18 +173,20 @@ export class UninstallAction extends Action { super('extensions.uninstall', nls.localize('uninstall', "Uninstall Extension"), 'octicon octicon-x', true); } - public run(extension: IExtension): TPromise { - if (!window.confirm(nls.localize('deleteSure', "Are you sure you want to uninstall '{0}'?", extension.displayName))) { + run(extension: IExtension): TPromise { + const name = extension.manifest.displayName || extension.manifest.name; + + if (!window.confirm(nls.localize('deleteSure', "Are you sure you want to uninstall '{0}'?", name))) { return TPromise.as(null); } this.enabled = false; return this.extensionManagementService.getInstalled().then(localExtensions => { - const [local] = localExtensions.filter(local => extensionEquals(local, extension)); + const [local] = localExtensions.filter(local => extensionEquals(local.manifest, extension.manifest)); if (!local) { - return TPromise.wrapError(nls.localize('notFound', "Extension '{0}' not installed.", extension.displayName)); + return TPromise.wrapError(nls.localize('notFound', "Extension '{0}' not installed.", name)); } return this.extensionManagementService.uninstall(local) @@ -195,9 +197,11 @@ export class UninstallAction extends Action { } private onSuccess(extension: IExtension) { + const name = extension.manifest.displayName || extension.manifest.name; this.reportTelemetry(extension, true); + this.messageService.show(Severity.Info, { - message: nls.localize('success-uninstalled', "'{0}' was successfully uninstalled. Restart to deactivate it.", extension.displayName), + message: nls.localize('success-uninstalled', "'{0}' was successfully uninstalled. Restart to deactivate it.", name), actions: [ CloseAction, this.instantiationService.createInstance(ReloadWindowAction, ReloadWindowAction.ID, nls.localize('restartNow2', "Restart Now")) -- GitLab