diff --git a/src/vs/workbench/parts/extensions/common/extensions.ts b/src/vs/workbench/parts/extensions/common/extensions.ts index 59b3f5e8590e81bb7d1a34ddc8c5a4152584e92e..bf50d9d44ae0c8b2d6956edb5a7fd510254ec68c 100644 --- a/src/vs/workbench/parts/extensions/common/extensions.ts +++ b/src/vs/workbench/parts/extensions/common/extensions.ts @@ -54,7 +54,9 @@ export interface IExtension { preview: boolean; getManifest(): TPromise; getReadme(): TPromise; + hasReadme(): boolean; getChangelog(): TPromise; + hasChangelog(): boolean; local?: ILocalExtension; locals?: ILocalExtension[]; gallery?: IGalleryExtension; diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts index 401fb1b2314ffa6d6f325e82825caa84f8f43e61..d1df1d8a8a9c38136602df993b75f944a85c62fb 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts @@ -423,17 +423,27 @@ export class ExtensionEditor extends BaseEditor { this.navbar.clear(); this.navbar.onChange(this.onNavbarChange.bind(this, extension), this, this.transientDisposables); - this.navbar.push(NavbarSection.Readme, localize('details', "Details"), localize('detailstooltip', "Extension details, rendered from the extension's 'README.md' file")); - if (extension.extensionPack.length) { - this.navbar.push(NavbarSection.ExtensionPack, localize('extensionPack', "Extension Pack"), localize('extensionsPack', "Set of extensions that can be installed together")); - } - this.navbar.push(NavbarSection.Contributions, localize('contributions', "Contributions"), localize('contributionstooltip', "Lists contributions to VS Code by this extension")); - this.navbar.push(NavbarSection.Changelog, localize('changelog', "Changelog"), localize('changelogtooltip', "Extension update history, rendered from the extension's 'CHANGELOG.md' file")); - if (extension.dependencies.length) { - this.navbar.push(NavbarSection.Dependencies, localize('dependencies', "Dependencies"), localize('dependenciestooltip', "Lists extensions this extension depends on")); + + if (extension.hasReadme()) { + this.navbar.push(NavbarSection.Readme, localize('details', "Details"), localize('detailstooltip', "Extension details, rendered from the extension's 'README.md' file")); } + this.extensionManifest.get() + .then(manifest => { + if (extension.extensionPack.length) { + this.navbar.push(NavbarSection.ExtensionPack, localize('extensionPack', "Extension Pack"), localize('extensionsPack', "Set of extensions that can be installed together")); + } + if (manifest.contributes) { + this.navbar.push(NavbarSection.Contributions, localize('contributions', "Contributions"), localize('contributionstooltip', "Lists contributions to VS Code by this extension")); + } + if (extension.hasChangelog()) { + this.navbar.push(NavbarSection.Changelog, localize('changelog', "Changelog"), localize('changelogtooltip', "Extension update history, rendered from the extension's 'CHANGELOG.md' file")); + } + if (extension.dependencies.length) { + this.navbar.push(NavbarSection.Dependencies, localize('dependencies', "Dependencies"), localize('dependenciestooltip', "Lists extensions this extension depends on")); + } + this.editorLoadComplete = true; + }); - this.editorLoadComplete = true; return super.setInput(input, options, token); } diff --git a/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts b/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts index 2e1ca35977cd7c8c4c054f7557fdbad99f296778..01ae04654301290f969e7036dd9d525495fe0f60 100644 --- a/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts +++ b/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts @@ -218,6 +218,18 @@ class Extension implements IExtension { return TPromise.as(this.local.manifest); } + hasReadme(): boolean { + if (this.gallery && !this.isGalleryOutdated() && this.gallery.assets.readme) { + return true; + } + + if (this.local && this.local.readmeUrl) { + return true; + } + + return this.type === LocalExtensionType.System; + } + getReadme(): TPromise { if (this.gallery && !this.isGalleryOutdated()) { if (this.gallery.assets.readme) { @@ -242,6 +254,19 @@ ${this.description} return TPromise.wrapError(new Error('not available')); } + hasChangelog(): boolean { + if (this.gallery && this.gallery.assets.changelog && !this.isGalleryOutdated()) { + return true; + } + + if (this.local && this.local.changelogUrl) { + const uri = URI.parse(this.local.changelogUrl); + return uri.scheme === 'file'; + } + + return false; + } + getChangelog(): TPromise { if (this.gallery && this.gallery.assets.changelog && !this.isGalleryOutdated()) { return this.galleryService.getChangelog(this.gallery);