diff --git a/src/vs/code/node/cliProcessMain.ts b/src/vs/code/node/cliProcessMain.ts index f3cb2d252de..ee5c7e06f3d 100644 --- a/src/vs/code/node/cliProcessMain.ts +++ b/src/vs/code/node/cliProcessMain.ts @@ -98,7 +98,7 @@ class Main { console.log(localize('installing', "Installing...")); return this.extensionManagementService.install(extension).then(() => { - console.log(localize('successInstall', "Extension '{0}' v{1} was successfully installed!", id, extension.manifest.version)); + console.log(localize('successInstall', "Extension '{0}' v{1} was successfully installed!", id, extension.versions[0].version)); }); }); }); diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index 33532c32e30..781321bb5db 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -31,18 +31,25 @@ export interface IGalleryVersion { downloadHeaders: { [key: string]: string; }; } -export interface IGalleryMetadata { - publisherId: string; - publisherDisplayName: string; - installCount: number; - versions: IGalleryVersion[]; +export interface IExtensionIdentity { + name: string; + publisher: string; } export interface IGalleryExtension { id: string; - manifest: IExtensionManifest; - metadata: IGalleryMetadata; - path?: string; + name: string; + displayName: string; + publisherId: string; + publisher: string; + publisherDisplayName: string; + description: string; + installCount: number; + versions: IGalleryVersion[]; +} + +export interface IGalleryMetadata { + // TODO, do we need this?! } export interface IExtension { diff --git a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts index 214d6ffe840..02ab57ac665 100644 --- a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { TPromise } from 'vs/base/common/winjs.base'; -import { IGalleryExtension, IExtensionManifest, IExtensionGalleryService, IGalleryVersion, IQueryOptions, IQueryResult } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { IGalleryExtension, IExtensionGalleryService, IGalleryVersion, IQueryOptions, IQueryResult } from 'vs/platform/extensionManagement/common/extensionManagement'; import { isUndefined } from 'vs/base/common/types'; import { assign, getOrDefault } from 'vs/base/common/objects'; import { IRequestService } from 'vs/platform/request/common/request'; @@ -171,24 +171,16 @@ function toExtension(galleryExtension: IRawGalleryExtension, extensionsGalleryUr iconUrl: `${ v.assetUri }/Microsoft.VisualStudio.Services.Icons.Default` })); - const manifest: IExtensionManifest = { - name: galleryExtension.extensionName, - displayName: galleryExtension.displayName || galleryExtension.extensionName, - publisher: galleryExtension.publisher.publisherName, - version: versions[0].version, - engines: { vscode: void 0 }, // TODO: ugly - description: galleryExtension.shortDescription || '', - }; - return { id: galleryExtension.extensionId, - manifest, - metadata: { - publisherId: galleryExtension.publisher.publisherId, - publisherDisplayName: galleryExtension.publisher.displayName, - installCount: getInstallCount(galleryExtension.statistics), - versions - } + name: galleryExtension.extensionName, + displayName: galleryExtension.displayName, + publisherId: galleryExtension.publisher.publisherId, + publisher: galleryExtension.publisher.publisherName, + publisherDisplayName: galleryExtension.publisher.displayName, + description: galleryExtension.shortDescription || '', + installCount: getInstallCount(galleryExtension.statistics), + versions }; } diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index 919fdbdb390..0639742d9f5 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -15,7 +15,7 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { flatten } from 'vs/base/common/arrays'; import { extract, buffer } from 'vs/base/node/zip'; import { Promise, TPromise } from 'vs/base/common/winjs.base'; -import { IExtensionManagementService, IExtension, IGalleryExtension, IExtensionManifest, IGalleryVersion, IGalleryMetadata } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { IExtensionManagementService, IExtension, IGalleryExtension, IExtensionIdentity, IExtensionManifest, IGalleryVersion, IGalleryMetadata } from 'vs/platform/extensionManagement/common/extensionManagement'; import { download, json, IRequestOptions } from 'vs/base/node/request'; import { getProxyAgent } from 'vs/base/node/proxy'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; @@ -41,7 +41,7 @@ function parseManifest(raw: string): TPromise<{ manifest: IExtensionManifest; me }); } -function validate(zipPath: string, extension?: IExtensionManifest, version = extension && extension.version): TPromise { +function validate(zipPath: string, extension?: IExtensionIdentity, version?: string): TPromise { return buffer(zipPath, 'extension/package.json') .then(buffer => parseManifest(buffer.toString('utf8'))) .then(({ manifest }) => { @@ -63,7 +63,7 @@ function validate(zipPath: string, extension?: IExtensionManifest, version = ext }); } -function getExtensionId(extension: IExtensionManifest, version = extension.version): string { +function getExtensionId(extension: IExtensionIdentity, version: string): string { return `${ extension.publisher }.${ extension.name }-${ version }`; } @@ -116,12 +116,11 @@ export class ExtensionManagementService implements IExtensionManagementService { } const extension = arg as IGalleryExtension; - const { manifest } = extension; - const id = getExtensionId(manifest); + const id = getExtensionId(extension, extension.versions[0].version); return this.isObsolete(id).then(obsolete => { if (obsolete) { - return TPromise.wrapError(new Error(nls.localize('restartCode', "Please restart Code before reinstalling {0}.", manifest.name))); + return TPromise.wrapError(new Error(nls.localize('restartCode', "Please restart Code before reinstalling {0}.", extension.displayName || extension.name))); } return this.installFromGallery(arg); @@ -134,23 +133,23 @@ export class ExtensionManagementService implements IExtensionManagementService { const url = versionInfo.downloadUrl; const headers = versionInfo.downloadHeaders; const zipPath = path.join(tmpdir(), extension.id); - const id = getExtensionId(extension.manifest, version); + const id = getExtensionId(extension, version); return this.request(url) .then(opts => assign(opts, { headers })) .then(opts => download(zipPath, opts)) - .then(() => validate(zipPath, extension.manifest, version)) - .then(() => this.installValidExtension(zipPath, id, extension.metadata)); + .then(() => validate(zipPath, extension, version)) + .then(() => this.installValidExtension(zipPath, id)); }); } private getLastValidExtensionVersion(extension: IGalleryExtension): TPromise { - return this._getLastValidExtensionVersion(extension, extension.metadata.versions); + return this._getLastValidExtensionVersion(extension, extension.versions); } private _getLastValidExtensionVersion(extension: IGalleryExtension, versions: IGalleryVersion[]): TPromise { if (!versions.length) { - return TPromise.wrapError(new Error(nls.localize('noCompatible', "Couldn't find a compatible version of {0} with this version of Code.", extension.manifest.displayName))); + return TPromise.wrapError(new Error(nls.localize('noCompatible', "Couldn't find a compatible version of {0} with this version of Code.", extension.displayName || extension.name))); } const version = versions[0]; @@ -172,7 +171,7 @@ export class ExtensionManagementService implements IExtensionManagementService { } private installFromZip(zipPath: string): TPromise { - return validate(zipPath).then(manifest => this.installValidExtension(zipPath, getExtensionId(manifest))); + return validate(zipPath).then(manifest => this.installValidExtension(zipPath, getExtensionId(manifest, manifest.version))); } private installValidExtension(zipPath: string, id: string, metadata: IGalleryMetadata = null): TPromise { @@ -238,7 +237,7 @@ export class ExtensionManagementService implements IExtensionManagementService { removeDeprecatedExtensions(): TPromise { const outdated = this.getOutdatedExtensionIds() - .then(extensions => extensions.map(e => getExtensionId(e.manifest))); + .then(extensions => extensions.map(e => getExtensionId(e.manifest, e.manifest.version))); const obsolete = this.getObsoleteExtensions() .then(obsolete => Object.keys(obsolete)); diff --git a/src/vs/platform/extensionManagement/node/extensionManagementUtil.ts b/src/vs/platform/extensionManagement/node/extensionManagementUtil.ts index 5ec8ff29733..187d5273792 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementUtil.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementUtil.ts @@ -5,11 +5,11 @@ 'use strict'; -import { IExtension, IExtensionManifest, IExtensionManagementService, IExtensionGalleryService } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { IExtension, IExtensionIdentity, IExtensionManagementService, IExtensionGalleryService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { TPromise } from 'vs/base/common/winjs.base'; import * as semver from 'semver'; -export function extensionEquals(one: IExtensionManifest, other: IExtensionManifest): boolean { +export function extensionEquals(one: IExtensionIdentity, other: IExtensionIdentity): boolean { return one.publisher === other.publisher && one.name === other.name; } @@ -38,8 +38,8 @@ export function getOutdatedExtensions(extensionsService: IExtensionManagementSer const available = result.firstPage; return available.map(extension => { - const local = installed.filter(local => extensionEquals(local.manifest, extension.manifest))[0]; - if (local && semver.lt(local.manifest.version, extension.manifest.version)) { + const local = installed.filter(local => extensionEquals(local.manifest, extension))[0]; + if (local && semver.lt(local.manifest.version, extension.versions[0].version)) { return local; } else { return null; diff --git a/src/vs/workbench/parts/extensions/common/extensionsInput.ts b/src/vs/workbench/parts/extensions/common/extensionsInput.ts index 474132b1d10..2d1bac714c0 100644 --- a/src/vs/workbench/parts/extensions/common/extensionsInput.ts +++ b/src/vs/workbench/parts/extensions/common/extensionsInput.ts @@ -7,14 +7,14 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { EditorInput } from 'vs/workbench/common/editor'; -import { IExtension, IGalleryExtension } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { IGalleryExtension } from 'vs/platform/extensionManagement/common/extensionManagement'; export class ExtensionsInput extends EditorInput { static get ID() { return 'workbench.extensions.input2'; } - get extension(): IExtension | IGalleryExtension { return this._extension; } + get extension(): IGalleryExtension { return this._extension; } - constructor(private _extension: IExtension | IGalleryExtension) { + constructor(private _extension: IGalleryExtension) { super(); } @@ -23,7 +23,7 @@ export class ExtensionsInput extends EditorInput { } getName(): string { - return this.extension.manifest.displayName; + return this.extension.displayName; } matches(other: any): boolean { diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts index 34f15382fe6..7f58a2d3c32 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts @@ -62,7 +62,7 @@ export class ExtensionEditor extends BaseEditor { addClass(this.body, 'loading'); this.body.innerHTML = ''; - const [version] = input.extension.metadata.versions; + const [version] = input.extension.versions; const headers = version.downloadHeaders; const promise = super.setInput(input, options) diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts index 1614289b351..878c3e6289f 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts @@ -127,7 +127,7 @@ export class InstallAction extends Action { this.enabled = false; return this.extensionManagementService.getInstalled() - .then(installed => installed.some(({ manifest }) => extensionEquals(manifest, extension.manifest))) + .then(installed => installed.some(({ manifest }) => extensionEquals(manifest, extension))) .then(isUpdate => { return this.extensionManagementService .install(extension) @@ -140,7 +140,7 @@ export class InstallAction extends Action { private onSuccess(extension: IGalleryExtension, isUpdate: boolean) { this.reportTelemetry(extension, isUpdate, true); this.messageService.show(Severity.Info, { - message: nls.localize('success-installed', "'{0}' was successfully installed. Restart to enable it.", extension.manifest.displayName), + message: nls.localize('success-installed', "'{0}' was successfully installed. Restart to enable it.", extension.displayName || extension.name), actions: [ CloseAction, this.instantiationService.createInstance(ReloadWindowAction, ReloadWindowAction.ID, nls.localize('restartNow', "Restart Now")) diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsList.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsList.ts index a7526bdc2e8..6f9f7494fb0 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsList.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsList.ts @@ -9,10 +9,10 @@ import { append, emmet as $, addClass, removeClass } from 'vs/base/browser/dom'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IDelegate } from 'vs/base/browser/ui/list/list'; import { IPagedRenderer } from 'vs/base/browser/ui/list/listPaging'; -import { IExtension, IGalleryExtension } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { IGalleryExtension } from 'vs/platform/extensionManagement/common/extensionManagement'; export interface ITemplateData { - extension: IExtension | IGalleryExtension; + extension: IGalleryExtension; element: HTMLElement; icon: HTMLImageElement; name: HTMLElement; @@ -21,12 +21,12 @@ export interface ITemplateData { description: HTMLElement; } -export class Delegate implements IDelegate { +export class Delegate implements IDelegate { getHeight() { return 62; } getTemplateId() { return 'extension'; } } -export class Renderer implements IPagedRenderer { +export class Renderer implements IPagedRenderer { private _templates: ITemplateData[]; get templates(): ITemplateData[] { return this._templates; } @@ -64,30 +64,30 @@ export class Renderer implements IPagedRenderer