From 40559425c7c7219a25f148a41d678c488629a662 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 27 May 2020 17:14:10 -0700 Subject: [PATCH] Revert "allow setting default tag while installing extensions" This reverts commit a2bc061bc6f66e4823ba6fe6db8d9b25782b2d8b. Revert "merge metadata into local extension" This reverts commit b354b435ceef49374b0ab08b2b42d9e6f01fe0b0. --- src/vs/code/node/cliProcessMain.ts | 14 +++---- src/vs/platform/environment/node/argv.ts | 2 - .../common/extensionManagement.ts | 8 ++-- .../common/extensionManagementUtil.ts | 6 +-- .../node/extensionManagementService.ts | 42 ++++++++++--------- .../node/extensionsScanner.ts | 29 ++++++------- .../browser/extensionsWorkbenchService.ts | 6 +-- 7 files changed, 52 insertions(+), 55 deletions(-) diff --git a/src/vs/code/node/cliProcessMain.ts b/src/vs/code/node/cliProcessMain.ts index fbb9673b535..ea0f62156a2 100644 --- a/src/vs/code/node/cliProcessMain.ts +++ b/src/vs/code/node/cliProcessMain.ts @@ -86,7 +86,7 @@ export class Main { } else if (argv['list-extensions']) { await this.listExtensions(!!argv['show-versions'], argv['category']); } else if (argv['install-extension']) { - await this.installExtensions(argv['install-extension'], !!argv['force'], !!argv['default']); + await this.installExtensions(argv['install-extension'], !!argv['force']); } else if (argv['uninstall-extension']) { await this.uninstallExtension(argv['uninstall-extension']); } else if (argv['locate-extension']) { @@ -126,7 +126,7 @@ export class Main { extensions.forEach(e => console.log(getId(e.manifest, showVersions))); } - private async installExtensions(extensions: string[], force: boolean, isDefault: boolean): Promise { + private async installExtensions(extensions: string[], force: boolean): Promise { const failed: string[] = []; const installedExtensionsManifests: IExtensionManifest[] = []; if (extensions.length) { @@ -135,7 +135,7 @@ export class Main { for (const extension of extensions) { try { - const manifest = await this.installExtension(extension, force, isDefault); + const manifest = await this.installExtension(extension, force); if (manifest) { installedExtensionsManifests.push(manifest); } @@ -150,7 +150,7 @@ export class Main { return failed.length ? Promise.reject(localize('installation failed', "Failed Installing Extensions: {0}", failed.join(', '))) : Promise.resolve(); } - private async installExtension(extension: string, force: boolean, isDefault: boolean): Promise { + private async installExtension(extension: string, force: boolean): Promise { if (/\.vsix$/i.test(extension)) { extension = path.isAbsolute(extension) ? extension : path.join(process.cwd(), extension); @@ -205,7 +205,7 @@ export class Main { } console.log(localize('updateMessage', "Updating the extension '{0}' to the version {1}", id, extension.version)); } - await this.installFromGallery(id, extension, isDefault); + await this.installFromGallery(id, extension); return manifest; })); } @@ -227,11 +227,11 @@ export class Main { return true; } - private async installFromGallery(id: string, extension: IGalleryExtension, isDefault: boolean): Promise { + private async installFromGallery(id: string, extension: IGalleryExtension): Promise { console.log(localize('installing', "Installing extension '{0}' v{1}...", id, extension.version)); try { - await this.extensionManagementService.installFromGallery(extension, isDefault); + await this.extensionManagementService.installFromGallery(extension); console.log(localize('successInstall', "Extension '{0}' v{1} was successfully installed.", id, extension.version)); } catch (error) { if (isPromiseCanceledError(error)) { diff --git a/src/vs/platform/environment/node/argv.ts b/src/vs/platform/environment/node/argv.ts index 5bd1488b472..61c2b16ad7a 100644 --- a/src/vs/platform/environment/node/argv.ts +++ b/src/vs/platform/environment/node/argv.ts @@ -72,7 +72,6 @@ export interface ParsedArgs { remote?: string; 'disable-user-env-probe'?: boolean; 'force'?: boolean; - 'default'?: boolean; 'force-user-env'?: boolean; 'sync'?: 'on' | 'off'; @@ -188,7 +187,6 @@ export const OPTIONS: OptionDescriptions> = { 'file-chmod': { type: 'boolean' }, 'driver-verbose': { type: 'boolean' }, 'force': { type: 'boolean' }, - 'default': { type: 'boolean' }, 'trace': { type: 'boolean' }, 'trace-category-filter': { type: 'string' }, 'trace-options': { type: 'string' }, diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index b52906d91a7..a3867cd9c02 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -92,9 +92,7 @@ export interface IGalleryMetadata { export interface ILocalExtension extends IExtension { readonly manifest: IExtensionManifest; - isDefault: boolean; - publisherId: string | null; - publisherDisplayName: string | null; + metadata: IGalleryMetadata; readmeUrl: URI | null; changelogUrl: URI | null; } @@ -206,8 +204,8 @@ export interface IExtensionManagementService { zip(extension: ILocalExtension): Promise; unzip(zipLocation: URI): Promise; getManifest(vsix: URI): Promise; - install(vsix: URI, isDefault?: boolean): Promise; - installFromGallery(extension: IGalleryExtension, isDefault?: boolean): Promise; + install(vsix: URI): Promise; + installFromGallery(extension: IGalleryExtension): Promise; uninstall(extension: ILocalExtension, force?: boolean): Promise; reinstallFromGallery(extension: ILocalExtension): Promise; getInstalled(type?: ExtensionType): Promise; diff --git a/src/vs/platform/extensionManagement/common/extensionManagementUtil.ts b/src/vs/platform/extensionManagement/common/extensionManagementUtil.ts index fef60bf20b8..bad92e00651 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagementUtil.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagementUtil.ts @@ -69,9 +69,9 @@ export function getLocalExtensionTelemetryData(extension: ILocalExtension): any id: extension.identifier.id, name: extension.manifest.name, galleryId: null, - publisherId: extension.publisherId, + publisherId: extension.metadata ? extension.metadata.publisherId : null, publisherName: extension.manifest.publisher, - publisherDisplayName: extension.publisherDisplayName, + publisherDisplayName: extension.metadata ? extension.metadata.publisherDisplayName : null, dependencies: extension.manifest.extensionDependencies && extension.manifest.extensionDependencies.length > 0 }; } @@ -116,4 +116,4 @@ export function getMaliciousExtensionsSet(report: IReportedExtension[]): Set { + install(vsix: URI): Promise { this.logService.trace('ExtensionManagementService#install', vsix.toString()); return createCancelablePromise(token => { return this.downloadVsix(vsix).then(downloadLocation => { @@ -192,10 +192,10 @@ export class ExtensionManagementService extends Disposable implements IExtension .then(() => { this.logService.info('Installing the extension:', identifier.id); this._onInstallExtension.fire({ identifier, zipPath }); - return this.getGalleryMetadata(getGalleryExtensionId(manifest.publisher, manifest.name)) + return this.getMetadata(getGalleryExtensionId(manifest.publisher, manifest.name)) .then( - metadata => this.installFromZipPath(identifierWithVersion, zipPath, { ...metadata, isDefault }, operation, token), - () => this.installFromZipPath(identifierWithVersion, zipPath, { isDefault }, operation, token)) + metadata => this.installFromZipPath(identifierWithVersion, zipPath, metadata, operation, token), + () => this.installFromZipPath(identifierWithVersion, zipPath, null, operation, token)) .then( local => { this.logService.info('Successfully installed the extension:', identifier.id); return local; }, e => { @@ -219,7 +219,7 @@ export class ExtensionManagementService extends Disposable implements IExtension return this.downloadService.download(vsix, URI.file(downloadedLocation)).then(() => URI.file(downloadedLocation)); } - private installFromZipPath(identifierWithVersion: ExtensionIdentifierWithVersion, zipPath: string, metadata: IMetadata, operation: InstallOperation, token: CancellationToken): Promise { + private installFromZipPath(identifierWithVersion: ExtensionIdentifierWithVersion, zipPath: string, metadata: IGalleryMetadata | null, operation: InstallOperation, token: CancellationToken): Promise { return this.toNonCancellablePromise(this.installExtension({ zipPath, identifierWithVersion, metadata }, token) .then(local => this.installDependenciesAndPackExtensions(local, null) .then( @@ -239,7 +239,7 @@ export class ExtensionManagementService extends Disposable implements IExtension )); } - async installFromGallery(extension: IGalleryExtension, isDefault?: boolean): Promise { + async installFromGallery(extension: IGalleryExtension): Promise { if (!this.galleryService.isEnabled()) { return Promise.reject(new Error(nls.localize('MarketPlaceDisabled', "Marketplace is not enabled"))); } @@ -287,11 +287,8 @@ export class ExtensionManagementService extends Disposable implements IExtension } this.downloadInstallableExtension(extension, operation) - .then(installableExtension => { - installableExtension.metadata.isDefault = isDefault !== undefined ? isDefault : existingExtension.isDefault; - return this.installExtension(installableExtension, cancellationToken) - .then(local => this.extensionsDownloader.delete(URI.file(installableExtension.zipPath)).finally(() => { }).then(() => local)); - }) + .then(installableExtension => this.installExtension(installableExtension, cancellationToken) + .then(local => this.extensionsDownloader.delete(URI.file(installableExtension.zipPath)).finally(() => { }).then(() => local))) .then(local => this.installDependenciesAndPackExtensions(local, existingExtension) .then(() => local, error => this.uninstall(local, true).then(() => Promise.reject(error), () => Promise.reject(error)))) .then( @@ -361,7 +358,7 @@ export class ExtensionManagementService extends Disposable implements IExtension .then(report => getMaliciousExtensionsSet(report).has(extension.identifier.id)); } - private downloadInstallableExtension(extension: IGalleryExtension, operation: InstallOperation): Promise> { + private downloadInstallableExtension(extension: IGalleryExtension, operation: InstallOperation): Promise { const metadata = { id: extension.identifier.uuid, publisherId: extension.publisherId, @@ -376,7 +373,7 @@ export class ExtensionManagementService extends Disposable implements IExtension this.logService.info('Downloaded extension:', extension.identifier.id, zipPath); return getManifest(zipPath) .then( - manifest => (>{ zipPath, identifierWithVersion: new ExtensionIdentifierWithVersion(extension.identifier, manifest.version), metadata }), + manifest => ({ zipPath, identifierWithVersion: new ExtensionIdentifierWithVersion(extension.identifier, manifest.version), metadata }), error => Promise.reject(new ExtensionManagementError(this.joinErrors(error).message, INSTALL_ERROR_VALIDATING)) ); }, @@ -422,7 +419,8 @@ export class ExtensionManagementService extends Disposable implements IExtension let local = await this.extensionsScanner.extractUserExtension(identifierWithVersion, zipPath, token); this.logService.info('Installation completed.', identifier.id); if (metadata) { - local = await this.extensionsScanner.saveMetadataForLocalExtension(local, metadata); + this.setMetadata(local, metadata); + local = await this.extensionsScanner.saveMetadataForLocalExtension(local); } return local; } @@ -483,14 +481,15 @@ export class ExtensionManagementService extends Disposable implements IExtension async updateMetadata(local: ILocalExtension, metadata: IGalleryMetadata): Promise { this.logService.trace('ExtensionManagementService#updateMetadata', local.identifier.id); - local = await this.extensionsScanner.saveMetadataForLocalExtension(local, { ...metadata, isDefault: local.isDefault }); + local.metadata = metadata; + local = await this.extensionsScanner.saveMetadataForLocalExtension(local); this.manifestCache.invalidate(); return local; } - private getGalleryMetadata(extensionName: string): Promise { + private getMetadata(extensionName: string): Promise { return this.findGalleryExtensionByName(extensionName) - .then(galleryExtension => galleryExtension ? { id: galleryExtension.identifier.uuid, publisherDisplayName: galleryExtension.publisherDisplayName, publisherId: galleryExtension.publisherId } : undefined); + .then(galleryExtension => galleryExtension ? { id: galleryExtension.identifier.uuid, publisherDisplayName: galleryExtension.publisherDisplayName, publisherId: galleryExtension.publisherId } : null); } private findGalleryExtension(local: ILocalExtension): Promise { @@ -630,6 +629,11 @@ export class ExtensionManagementService extends Disposable implements IExtension return this.extensionsScanner.scanExtensions(type); } + private setMetadata(local: ILocalExtension, metadata: IGalleryMetadata): void { + local.metadata = metadata; + local.identifier.uuid = metadata.id; + } + removeDeprecatedExtensions(): Promise { return this.extensionsScanner.cleanUp(); } diff --git a/src/vs/platform/extensionManagement/node/extensionsScanner.ts b/src/vs/platform/extensionManagement/node/extensionsScanner.ts index 19396b9a19f..cfffb08b2ef 100644 --- a/src/vs/platform/extensionManagement/node/extensionsScanner.ts +++ b/src/vs/platform/extensionManagement/node/extensionsScanner.ts @@ -32,8 +32,6 @@ const INSTALL_ERROR_EXTRACTING = 'extracting'; const INSTALL_ERROR_DELETING = 'deleting'; const INSTALL_ERROR_RENAMING = 'renaming'; -export type IMetadata = Partial & { isDefault: boolean; }; - export class ExtensionsScanner extends Disposable { private readonly systemExtensionsPath: string; @@ -129,13 +127,14 @@ export class ExtensionsScanner extends Disposable { throw new Error(localize('cannot read', "Cannot read the extension from {0}", this.extensionsPath)); } - async saveMetadataForLocalExtension(local: ILocalExtension, metadata: IMetadata): Promise { - this.setMetadata(local, metadata); - const manifestPath = path.join(local.location.fsPath, 'package.json'); - const raw = await pfs.readFile(manifestPath, 'utf8'); - const { manifest } = await this.parseManifest(raw); - assign(manifest, { __metadata: metadata }); - await pfs.writeFile(manifestPath, JSON.stringify(manifest, null, '\t')); + async saveMetadataForLocalExtension(local: ILocalExtension): Promise { + if (local.metadata) { + const manifestPath = path.join(local.location.fsPath, 'package.json'); + const raw = await pfs.readFile(manifestPath, 'utf8'); + const { manifest } = await this.parseManifest(raw); + assign(manifest, { __metadata: local.metadata }); + await pfs.writeFile(manifestPath, JSON.stringify(manifest, null, '\t')); + } return local; } @@ -229,7 +228,7 @@ export class ExtensionsScanner extends Disposable { const changelog = children.filter(child => /^changelog(\.txt|\.md|)$/i.test(child))[0]; const changelogUrl = changelog ? URI.file(path.join(extensionPath, changelog)) : null; const identifier = { id: getGalleryExtensionId(manifest.publisher, manifest.name) }; - const local = { type, identifier, manifest, location: URI.file(extensionPath), readmeUrl, changelogUrl, publisherDisplayName: null, publisherId: null, isDefault: false }; + const local = { type, identifier, manifest, metadata, location: URI.file(extensionPath), readmeUrl, changelogUrl }; if (metadata) { this.setMetadata(local, metadata); } @@ -257,11 +256,9 @@ export class ExtensionsScanner extends Disposable { } } - private setMetadata(local: ILocalExtension, metadata: IMetadata): void { - local.publisherDisplayName = metadata.publisherDisplayName || null; - local.publisherId = metadata.publisherId || null; + private setMetadata(local: ILocalExtension, metadata: IGalleryMetadata): void { + local.metadata = metadata; local.identifier.uuid = metadata.id; - local.isDefault = metadata.isDefault; } private async removeUninstalledExtensions(): Promise { @@ -317,7 +314,7 @@ export class ExtensionsScanner extends Disposable { return this._devSystemExtensionsPath; } - private async readManifest(extensionPath: string): Promise<{ manifest: IExtensionManifest; metadata: IMetadata | null; }> { + private async readManifest(extensionPath: string): Promise<{ manifest: IExtensionManifest; metadata: IGalleryMetadata; }> { const promises = [ pfs.readFile(path.join(extensionPath, 'package.json'), 'utf8') .then(raw => this.parseManifest(raw)), @@ -333,7 +330,7 @@ export class ExtensionsScanner extends Disposable { }; } - private parseManifest(raw: string): Promise<{ manifest: IExtensionManifest; metadata: IMetadata | null; }> { + private parseManifest(raw: string): Promise<{ manifest: IExtensionManifest; metadata: IGalleryMetadata; }> { return new Promise((c, e) => { try { const manifest = JSON.parse(raw); diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts index 29f0c58c756..ea288746ac5 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts @@ -94,8 +94,8 @@ class Extension implements IExtension { return this.gallery.publisherDisplayName || this.gallery.publisher; } - if (this.local?.publisherDisplayName) { - return this.local.publisherDisplayName; + if (this.local!.metadata && this.local!.metadata.publisherDisplayName) { + return this.local!.metadata.publisherDisplayName; } return this.local!.manifest.publisher; @@ -367,7 +367,7 @@ class Extensions extends Disposable { } // Sync the local extension with gallery extension if local extension doesnot has metadata if (extension.local) { - const local = extension.local.identifier.uuid ? extension.local : await this.server.extensionManagementService.updateMetadata(extension.local, { id: compatible.identifier.uuid, publisherDisplayName: compatible.publisherDisplayName, publisherId: compatible.publisherId }); + const local = extension.local.metadata ? extension.local : await this.server.extensionManagementService.updateMetadata(extension.local, { id: compatible.identifier.uuid, publisherDisplayName: compatible.publisherDisplayName, publisherId: compatible.publisherId }); extension.local = local; extension.gallery = compatible; this._onChange.fire({ extension }); -- GitLab