From dfc212369ab4acfd821e62559c38c1f4544cf62b Mon Sep 17 00:00:00 2001 From: Leila Lali Date: Thu, 15 Feb 2018 10:23:31 -0800 Subject: [PATCH] Feature/extension manager (#689) * getting the extension gallery from a static file and enabling the extension manager --- extensionsGallery.json | 13 ++++++ product.json | 8 +++- src/vs/base/node/request.ts | 3 +- src/vs/code/electron-main/menus.ts | 4 +- .../common/extensionManagement.ts | 1 + .../node/extensionGalleryService.ts | 41 +++++++++++++++---- .../node/extensionsWorkbenchService.ts | 8 +++- src/vs/workbench/workbench.main.ts | 4 +- 8 files changed, 66 insertions(+), 16 deletions(-) create mode 100644 extensionsGallery.json diff --git a/extensionsGallery.json b/extensionsGallery.json new file mode 100644 index 0000000000..c9bb8b76dd --- /dev/null +++ b/extensionsGallery.json @@ -0,0 +1,13 @@ +{ +"results": [{ + "extensions": [ + ], + "resultMetadata": [{ + "metadataType": "ResultCount", + "metadataItems": [{ + "name": "TotalCount", + "count": 0 + }] + }] +}] +} diff --git a/product.json b/product.json index 73d3a8660c..b3fd60ca32 100644 --- a/product.json +++ b/product.json @@ -28,5 +28,11 @@ "releaseNotesUrl": "https://go.microsoft.com/fwlink/?linkid=862039", "documentationUrl": "https://go.microsoft.com/fwlink/?linkid=862277", "commit": "9ca6200018fc206d67a47229f991901a8a453781", - "date": "2017-12-15T12:00:00.000Z" + "date": "2017-12-15T12:00:00.000Z", + "extensionsGallery": { + "serviceUrl":"https://raw.githubusercontent.com/Microsoft/sqlopsstudio/release/extensions/extensionsGallery.json" + }, + "extensionTips": { + "TestExtension": "{**/*.*}" + } } \ No newline at end of file diff --git a/src/vs/base/node/request.ts b/src/vs/base/node/request.ts index 089065408d..88afe8c37b 100644 --- a/src/vs/base/node/request.ts +++ b/src/vs/base/node/request.ts @@ -161,7 +161,8 @@ export function asJson(context: IRequestContext): TPromise { } if (!/application\/json/.test(context.res.headers['content-type'])) { - return e('Response doesn\'t appear to be JSON'); + // {{SQL CARBON EDIT}} + //return e('Response doesn\'t appear to be JSON'); } const buffer: string[] = []; diff --git a/src/vs/code/electron-main/menus.ts b/src/vs/code/electron-main/menus.ts index cd103548b3..100cd12d7f 100644 --- a/src/vs/code/electron-main/menus.ts +++ b/src/vs/code/electron-main/menus.ts @@ -690,7 +690,7 @@ export class CodeMenu { const scm = this.createMenuItem(nls.localize({ key: 'miViewSCM', comment: ['&& denotes a mnemonic'] }, "S&&CM"), 'workbench.view.scm'); // {{SQL CARBON EDIT}} // const debug = this.createMenuItem(nls.localize({ key: 'miViewDebug', comment: ['&& denotes a mnemonic'] }, "&&Debug"), 'workbench.view.debug'); - // const extensions = this.createMenuItem(nls.localize({ key: 'miViewExtensions', comment: ['&& denotes a mnemonic'] }, "E&&xtensions"), 'workbench.view.extensions'); + const extensions = this.createMenuItem(nls.localize({ key: 'miViewExtensions', comment: ['&& denotes a mnemonic'] }, "E&&xtensions"), 'workbench.view.extensions'); const output = this.createMenuItem(nls.localize({ key: 'miToggleOutput', comment: ['&& denotes a mnemonic'] }, "&&Output"), 'workbench.action.output.toggleOutput'); // {{SQL CARBON EDIT}} // const debugConsole = this.createMenuItem(nls.localize({ key: 'miToggleDebugConsole', comment: ['&& denotes a mnemonic'] }, "De&&bug Console"), 'workbench.debug.action.toggleRepl'); @@ -766,7 +766,7 @@ export class CodeMenu { scm, // {{SQL CARBON EDIT}} // debug, - // extensions, + extensions, additionalViewlets, __separator__(), output, diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index 21a6598c4f..91ae52666a 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -131,6 +131,7 @@ export interface IGalleryExtensionAssets { readme: IGalleryExtensionAsset; changelog: IGalleryExtensionAsset; download: IGalleryExtensionAsset; + downloadPage?: IGalleryExtensionAsset; icon: IGalleryExtensionAsset; license: IGalleryExtensionAsset; repository: IGalleryExtensionAsset; diff --git a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts index 850483cc66..ea103a4f91 100644 --- a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts @@ -110,7 +110,9 @@ const AssetType = { Manifest: 'Microsoft.VisualStudio.Code.Manifest', VSIX: 'Microsoft.VisualStudio.Services.VSIXPackage', License: 'Microsoft.VisualStudio.Services.Content.License', - Repository: 'Microsoft.VisualStudio.Services.Links.Source' + Repository: 'Microsoft.VisualStudio.Services.Links.Source', + // {{SQL CARBON EDIT}} + DownloadPage: 'Microsoft.SQLOps.DownloadPage' }; const PropertyType = { @@ -204,6 +206,12 @@ function getStatistic(statistics: IRawGalleryExtensionStatistics[], name: string function getVersionAsset(version: IRawGalleryExtensionVersion, type: string): IGalleryExtensionAsset { const result = version.files.filter(f => f.assetType === type)[0]; + // {{SQL CARBON EDIT}} + let uriFromSource: string = undefined; + if (result) { + uriFromSource = result.source; + } + if (type === AssetType.Repository) { if (version.properties) { const results = version.properties.filter(p => p.key === type); @@ -235,15 +243,26 @@ function getVersionAsset(version: IRawGalleryExtensionVersion, type: string): IG if (type === AssetType.VSIX) { return { - uri: `${version.fallbackAssetUri}/${type}?redirect=true&install=true`, + // {{SQL CARBON EDIT}} + uri: uriFromSource || `${version.fallbackAssetUri}/${type}?redirect=true&install=true`, fallbackUri: `${version.fallbackAssetUri}/${type}?install=true` }; } - return { - uri: `${version.assetUri}/${type}`, - fallbackUri: `${version.fallbackAssetUri}/${type}` - }; + // {{SQL CARBON EDIT}} + if (version.assetUri) { + return { + uri: `${version.assetUri}/${type}`, + fallbackUri: `${version.fallbackAssetUri}/${type}` + }; + } else { + return { + uri: uriFromSource, + fallbackUri: `${version.fallbackAssetUri}/${type}` + }; + } + + } function getDependencies(version: IRawGalleryExtensionVersion): string[] { @@ -268,6 +287,8 @@ function toExtension(galleryExtension: IRawGalleryExtension, extensionsGalleryUr readme: getVersionAsset(version, AssetType.Details), changelog: getVersionAsset(version, AssetType.Changelog), download: getVersionAsset(version, AssetType.VSIX), + // {{SQL CARBON EDIT}} + downloadPage: getVersionAsset(version, AssetType.DownloadPage), icon: getVersionAsset(version, AssetType.Icon), license: getVersionAsset(version, AssetType.License), repository: getVersionAsset(version, AssetType.Repository), @@ -336,7 +357,8 @@ export class ExtensionGalleryService implements IExtensionGalleryService { } private api(path = ''): string { - return `${this.extensionsGalleryUrl}${path}`; + // {{SQL CARBON EDIT}} + return `${this.extensionsGalleryUrl}`; } isEnabled(): boolean { @@ -428,7 +450,8 @@ export class ExtensionGalleryService implements IExtensionGalleryService { }); return this.requestService.request({ - type: 'POST', + // {{SQL CARBON EDIT}} + type: 'GET', url: this.api('/extensionquery'), data, headers @@ -538,7 +561,9 @@ export class ExtensionGalleryService implements IExtensionGalleryService { if (rawVersion) { extension.properties.dependencies = getDependencies(rawVersion); extension.properties.engine = getEngine(rawVersion); + // {{SQL CARBON EDIT}} extension.assets.download = getVersionAsset(rawVersion, AssetType.VSIX); + extension.assets.downloadPage = getVersionAsset(rawVersion, AssetType.DownloadPage); extension.version = rawVersion.version; return extension; } diff --git a/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts b/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts index e0dcf208cd..af0edbdac1 100644 --- a/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts +++ b/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts @@ -571,8 +571,12 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService { if (!gallery) { return TPromise.wrapError(new Error('Missing gallery')); } - - return this.extensionService.installFromGallery(gallery); + if (ext.gallery.assets.downloadPage && ext.gallery.assets.downloadPage.uri) { + window.open(ext.gallery.assets.downloadPage.uri); + return TPromise.wrap(void 0); + } else { + return this.extensionService.installFromGallery(gallery); + } } setEnablement(extension: IExtension, enablementState: EnablementState): TPromise { diff --git a/src/vs/workbench/workbench.main.ts b/src/vs/workbench/workbench.main.ts index 7b2a39e0a0..9d972c8037 100644 --- a/src/vs/workbench/workbench.main.ts +++ b/src/vs/workbench/workbench.main.ts @@ -68,8 +68,8 @@ import 'vs/workbench/parts/html/browser/html.contribution'; // import 'vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution'; import 'vs/workbench/parts/extensions/electron-browser/extensions.contribution'; -//import 'vs/workbench/parts/extensions/browser/extensionsQuickOpen'; -//import 'vs/workbench/parts/extensions/electron-browser/extensionsViewlet'; // can be packaged separately +import 'vs/workbench/parts/extensions/browser/extensionsQuickOpen'; +import 'vs/workbench/parts/extensions/electron-browser/extensionsViewlet'; // can be packaged separately // import 'vs/workbench/parts/welcome/page/electron-browser/welcomePage.contribution';