提交 d351f7e2 编写于 作者: S Sandeep Somavarapu

Fix #67003

上级 389e4283
...@@ -136,7 +136,7 @@ export class Main { ...@@ -136,7 +136,7 @@ export class Main {
const [id, version] = getIdAndVersion(extension); const [id, version] = getIdAndVersion(extension);
return this.extensionManagementService.getInstalled(ExtensionType.User) return this.extensionManagementService.getInstalled(ExtensionType.User)
.then(installed => this.extensionGalleryService.getExtension({ id }, version) .then(installed => this.extensionGalleryService.getCompatibleExtension({ id }, version)
.then<IGalleryExtension>(null, err => { .then<IGalleryExtension>(null, err => {
if (err.responseText) { if (err.responseText) {
try { try {
......
...@@ -156,11 +156,11 @@ export interface IExtensionGalleryService { ...@@ -156,11 +156,11 @@ export interface IExtensionGalleryService {
getManifest(extension: IGalleryExtension, token: CancellationToken): Promise<IExtensionManifest | null>; getManifest(extension: IGalleryExtension, token: CancellationToken): Promise<IExtensionManifest | null>;
getChangelog(extension: IGalleryExtension, token: CancellationToken): Promise<string>; getChangelog(extension: IGalleryExtension, token: CancellationToken): Promise<string>;
getCoreTranslation(extension: IGalleryExtension, languageId: string): Promise<ITranslation | null>; getCoreTranslation(extension: IGalleryExtension, languageId: string): Promise<ITranslation | null>;
loadCompatibleVersion(extension: IGalleryExtension, fromVersion?: string): Promise<IGalleryExtension | null>;
getAllVersions(extension: IGalleryExtension, compatible: boolean): Promise<IGalleryExtensionVersion[]>; getAllVersions(extension: IGalleryExtension, compatible: boolean): Promise<IGalleryExtensionVersion[]>;
loadAllDependencies(dependencies: IExtensionIdentifier[], token: CancellationToken): Promise<IGalleryExtension[]>; loadAllDependencies(dependencies: IExtensionIdentifier[], token: CancellationToken): Promise<IGalleryExtension[]>;
getExtensionsReport(): Promise<IReportedExtension[]>; getExtensionsReport(): Promise<IReportedExtension[]>;
getExtension(id: IExtensionIdentifier, version?: string): Promise<IGalleryExtension | null>; getCompatibleExtension(extension: IGalleryExtension): Promise<IGalleryExtension | null>;
getCompatibleExtension(id: IExtensionIdentifier, version?: string): Promise<IGalleryExtension | null>;
} }
export interface InstallExtensionEvent { export interface InstallExtensionEvent {
......
...@@ -7,7 +7,7 @@ import { tmpdir } from 'os'; ...@@ -7,7 +7,7 @@ import { tmpdir } from 'os';
import * as path from 'path'; import * as path from 'path';
import { distinct } from 'vs/base/common/arrays'; import { distinct } from 'vs/base/common/arrays';
import { getErrorMessage, isPromiseCanceledError, canceled } from 'vs/base/common/errors'; import { getErrorMessage, isPromiseCanceledError, canceled } from 'vs/base/common/errors';
import { StatisticType, IGalleryExtension, IExtensionGalleryService, IGalleryExtensionAsset, IQueryOptions, SortBy, SortOrder, IExtensionIdentifier, IReportedExtension, InstallOperation, ITranslation, IGalleryExtensionVersion, IGalleryExtensionAssets } from 'vs/platform/extensionManagement/common/extensionManagement'; import { StatisticType, IGalleryExtension, IExtensionGalleryService, IGalleryExtensionAsset, IQueryOptions, SortBy, SortOrder, IExtensionIdentifier, IReportedExtension, InstallOperation, ITranslation, IGalleryExtensionVersion, IGalleryExtensionAssets, isIExtensionIdentifier } from 'vs/platform/extensionManagement/common/extensionManagement';
import { getGalleryExtensionId, getGalleryExtensionTelemetryData, adoptToGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { getGalleryExtensionId, getGalleryExtensionTelemetryData, adoptToGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil';
import { assign, getOrDefault } from 'vs/base/common/objects'; import { assign, getOrDefault } from 'vs/base/common/objects';
import { IRequestService } from 'vs/platform/request/node/request'; import { IRequestService } from 'vs/platform/request/node/request';
...@@ -351,12 +351,18 @@ export class ExtensionGalleryService implements IExtensionGalleryService { ...@@ -351,12 +351,18 @@ export class ExtensionGalleryService implements IExtensionGalleryService {
return !!this.extensionsGalleryUrl; return !!this.extensionsGalleryUrl;
} }
getExtension({ id, uuid }: IExtensionIdentifier, version?: string): Promise<IGalleryExtension | null> { getCompatibleExtension(arg1: IExtensionIdentifier | IGalleryExtension, version?: string): Promise<IGalleryExtension | null> {
const extension: IGalleryExtension | null = isIExtensionIdentifier(arg1) ? null : arg1;
if (extension && extension.properties.engine && isEngineValid(extension.properties.engine)) {
return Promise.resolve(extension);
}
const { id, uuid } = extension ? extension.identifier : <IExtensionIdentifier>arg1;
let query = new Query() let query = new Query()
.withFlags(Flags.IncludeAssetUri, Flags.IncludeStatistics, Flags.IncludeFiles, Flags.IncludeVersionProperties, Flags.ExcludeNonValidated) .withFlags(Flags.IncludeAssetUri, Flags.IncludeStatistics, Flags.IncludeFiles, Flags.IncludeVersionProperties, Flags.ExcludeNonValidated)
.withPage(1, 1) .withPage(1, 1)
.withFilter(FilterType.Target, 'Microsoft.VisualStudio.Code') .withFilter(FilterType.Target, 'Microsoft.VisualStudio.Code')
.withFilter(FilterType.ExcludeWithFlags, flagsToString(Flags.Unpublished)); .withFilter(FilterType.ExcludeWithFlags, flagsToString(Flags.Unpublished))
.withAssetTypes(AssetType.Manifest, AssetType.VSIX);
if (uuid) { if (uuid) {
query = query.withFilter(FilterType.ExtensionId, uuid); query = query.withFilter(FilterType.ExtensionId, uuid);
...@@ -364,15 +370,29 @@ export class ExtensionGalleryService implements IExtensionGalleryService { ...@@ -364,15 +370,29 @@ export class ExtensionGalleryService implements IExtensionGalleryService {
query = query.withFilter(FilterType.ExtensionName, id); query = query.withFilter(FilterType.ExtensionName, id);
} }
return this.queryGallery(query, CancellationToken.None).then(({ galleryExtensions }) => { return this.queryGallery(query, CancellationToken.None)
if (galleryExtensions.length) { .then(({ galleryExtensions }) => {
const galleryExtension = galleryExtensions[0]; const [rawExtension] = galleryExtensions;
const versionAsset = version ? galleryExtension.versions.filter(v => v.version === version)[0] : galleryExtension.versions[0]; if (!rawExtension || !rawExtension.versions.length) {
return null;
}
if (version) {
const versionAsset = rawExtension.versions.filter(v => v.version === version)[0];
if (versionAsset) { if (versionAsset) {
return toExtension(galleryExtension, versionAsset, 0, query); const extension = toExtension(rawExtension, versionAsset, 0, query);
if (extension.properties.engine && isEngineValid(extension.properties.engine)) {
return extension;
} }
} }
return null; return null;
}
return this.getLastValidExtensionVersion(rawExtension, rawExtension.versions)
.then(rawVersion => {
if (rawVersion) {
return toExtension(rawExtension, rawVersion, 0, query);
}
return null;
});
}); });
} }
...@@ -604,59 +624,6 @@ export class ExtensionGalleryService implements IExtensionGalleryService { ...@@ -604,59 +624,6 @@ export class ExtensionGalleryService implements IExtensionGalleryService {
}); });
} }
loadCompatibleVersion(extension: IGalleryExtension, fromVersion: string = extension.version): Promise<IGalleryExtension | null> {
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, Flags.ExcludeNonValidated)
.withPage(1, 1)
.withFilter(FilterType.Target, 'Microsoft.VisualStudio.Code')
.withFilter(FilterType.ExcludeWithFlags, flagsToString(Flags.Unpublished))
.withAssetTypes(AssetType.Manifest, AssetType.VSIX)
.withFilter(FilterType.ExtensionId, extension.identifier.uuid);
return this.queryGallery(query, CancellationToken.None)
.then(({ galleryExtensions }) => {
const [rawExtension] = galleryExtensions;
if (!rawExtension) {
return null;
}
const versions: IRawGalleryExtensionVersion[] = this.getVersionsFrom(rawExtension.versions, fromVersion);
if (!versions.length) {
return null;
}
return this.getLastValidExtensionVersion(rawExtension, versions)
.then(rawVersion => {
if (rawVersion) {
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 = 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<IGalleryExtension[]> { private loadDependencies(extensionNames: string[], token: CancellationToken): Promise<IGalleryExtension[]> {
if (!extensionNames || extensionNames.length === 0) { if (!extensionNames || extensionNames.length === 0) {
......
...@@ -333,7 +333,7 @@ export class ExtensionManagementService extends Disposable implements IExtension ...@@ -333,7 +333,7 @@ export class ExtensionManagementService extends Disposable implements IExtension
return Promise.reject(new ExtensionManagementError(nls.localize('malicious extension', "Can't install extension since it was reported to be problematic."), INSTALL_ERROR_MALICIOUS)); return Promise.reject(new ExtensionManagementError(nls.localize('malicious extension', "Can't install extension since it was reported to be problematic."), INSTALL_ERROR_MALICIOUS));
} }
const compatibleExtension = await this.galleryService.loadCompatibleVersion(extension); const compatibleExtension = await this.galleryService.getCompatibleExtension(extension);
if (!compatibleExtension) { if (!compatibleExtension) {
return Promise.reject(new ExtensionManagementError(nls.localize('notFoundCompatibleDependency', "Unable to install because, the extension '{0}' compatible with current version '{1}' of VS Code is not found.", extension.identifier.id, pkg.version), INSTALL_ERROR_INCOMPATIBLE)); return Promise.reject(new ExtensionManagementError(nls.localize('notFoundCompatibleDependency', "Unable to install because, the extension '{0}' compatible with current version '{1}' of VS Code is not found.", extension.identifier.id, pkg.version), INSTALL_ERROR_INCOMPATIBLE));
......
...@@ -129,6 +129,13 @@ export class ExtensionIdentifierWithVersion { ...@@ -129,6 +129,13 @@ export class ExtensionIdentifierWithVersion {
} }
} }
export function isIExtensionIdentifier(thing: any): thing is IExtensionIdentifier {
return thing
&& typeof thing === 'object'
&& typeof thing.id === 'string'
&& (!thing.uuid || typeof thing.uuid === 'string');
}
export interface IExtensionIdentifier { export interface IExtensionIdentifier {
id: string; id: string;
uuid?: string; uuid?: string;
......
...@@ -507,7 +507,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService, ...@@ -507,7 +507,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService,
// Loading the compatible version only there is an engine property // Loading the compatible version only there is an engine property
// Otherwise falling back to old way so that we will not make many roundtrips // Otherwise falling back to old way so that we will not make many roundtrips
if (gallery.properties.engine) { if (gallery.properties.engine) {
this.galleryService.loadCompatibleVersion(gallery) this.galleryService.getCompatibleExtension(gallery)
.then(compatible => compatible ? this.syncLocalWithGalleryExtension(result!, compatible) : null); .then(compatible => compatible ? this.syncLocalWithGalleryExtension(result!, compatible) : null);
} else { } else {
this.syncLocalWithGalleryExtension(result, gallery); this.syncLocalWithGalleryExtension(result, gallery);
...@@ -679,7 +679,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService, ...@@ -679,7 +679,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService,
return Promise.reject(new Error('Missing gallery')); return Promise.reject(new Error('Missing gallery'));
} }
return this.galleryService.getExtension(extension.gallery.identifier, version) return this.galleryService.getCompatibleExtension(extension.gallery.identifier, version)
.then(gallery => { .then(gallery => {
if (!gallery) { if (!gallery) {
return undefined; return undefined;
......
...@@ -190,7 +190,7 @@ export class ExtensionUrlHandler implements IExtensionUrlHandler, IURLHandler { ...@@ -190,7 +190,7 @@ export class ExtensionUrlHandler implements IExtensionUrlHandler, IURLHandler {
// Extension is not installed // Extension is not installed
else { else {
const galleryExtension = await this.galleryService.getExtension(extensionIdentifier); const galleryExtension = await this.galleryService.getCompatibleExtension(extensionIdentifier);
if (!galleryExtension) { if (!galleryExtension) {
return; return;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册