diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index 517dbb6199f348df4d6ab12e6c07b639745fd39d..47def838ba98477f9dfe03fdb4c9b286b5b76de0 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -279,7 +279,8 @@ export interface IExtensionGalleryService { getManifest(extension: IGalleryExtension, token: CancellationToken): Promise; getChangelog(extension: IGalleryExtension, token: CancellationToken): Promise; getCoreTranslation(extension: IGalleryExtension, languageId: string): Promise; - loadCompatibleVersion(extension: IGalleryExtension): Promise; + loadCompatibleVersion(extension: IGalleryExtension, fromVersion?: string): Promise; + getAllVersions(extension: IGalleryExtension): Promise; loadAllDependencies(dependencies: IExtensionIdentifier[], token: CancellationToken): Promise; getExtensionsReport(): Promise; getExtension(id: IExtensionIdentifier, version?: string): Promise; diff --git a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts index 240c532f9a2fd933684451fbe320367f356be703..7df454d366aafb749a06df770df3030640fa90db 100644 --- a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts @@ -578,11 +578,31 @@ export class ExtensionGalleryService implements IExtensionGalleryService { return this.getDependenciesReccursively(extensions.map(e => e.id), [], token); } - loadCompatibleVersion(extension: IGalleryExtension): Promise { - if (extension.properties.engine && isEngineValid(extension.properties.engine)) { - return Promise.resolve(extension); + getAllVersions(extension: IGalleryExtension): Promise { + let query = new Query() + .withFlags(Flags.IncludeVersions) + .withPage(1, 1) + .withFilter(FilterType.Target, 'Microsoft.VisualStudio.Code') + .withFilter(FilterType.ExcludeWithFlags, flagsToString(Flags.Unpublished)); + + if (extension.identifier.uuid) { + query = query.withFilter(FilterType.ExtensionId, extension.identifier.uuid); + } else { + query = query.withFilter(FilterType.ExtensionName, extension.identifier.id); } + return this.queryGallery(query, CancellationToken.None).then(({ galleryExtensions }) => { + if (galleryExtensions.length) { + return galleryExtensions[0].versions.map(v => v.version); + } + return []; + }); + } + + loadCompatibleVersion(extension: IGalleryExtension, fromVersion: string = extension.version): Promise { + if (extension.version === fromVersion && extension.properties.engine && isEngineValid(extension.properties.engine)) { + return Promise.resolve(extension); + } const query = new Query() .withFlags(Flags.IncludeVersions, Flags.IncludeFiles, Flags.IncludeVersionProperties) .withPage(1, 1) @@ -599,21 +619,40 @@ export class ExtensionGalleryService implements IExtensionGalleryService { return null; } - return this.getLastValidExtensionVersion(rawExtension, rawExtension.versions) + const versions: IRawGalleryExtensionVersion[] = this.getVersionsFrom(rawExtension.versions, fromVersion); + if (!versions.length) { + return null; + } + + return this.getLastValidExtensionVersion(rawExtension, versions) .then(rawVersion => { if (rawVersion) { - extension.properties.dependencies = getExtensions(rawVersion, PropertyType.Dependency); - extension.properties.engine = getEngine(rawVersion); - extension.properties.localizedLanguages = getLocalizedLanguages(rawVersion); - extension.assets.download = getVersionAsset(rawVersion, AssetType.VSIX); - extension.version = rawVersion.version; - return extension; + return toExtension(rawExtension, rawVersion, 0, query); } return null; }); }); } + private getVersionsFrom(versions: IRawGalleryExtensionVersion[], version: string): IRawGalleryExtensionVersion[] { + if (versions[0].version === version) { + return versions; + } + const result: IRawGalleryExtensionVersion[] = []; + let currentVersion: IRawGalleryExtensionVersion = null; + for (const v of versions) { + if (!currentVersion) { + if (v.version === version) { + currentVersion = v; + } + } + if (currentVersion) { + result.push(v); + } + } + return result; + } + private loadDependencies(extensionNames: string[], token: CancellationToken): Promise { if (!extensionNames || extensionNames.length === 0) { return Promise.resolve([]);