From 89affc5c617f9450265352957846f678fb2ffaff Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 14 Jun 2018 14:22:54 +0200 Subject: [PATCH] Use URI for extension location --- src/vs/base/parts/ipc/common/ipc.ts | 11 +++++ .../common/extensionManagement.ts | 3 +- .../common/extensionManagementIpc.ts | 46 +++++++++++-------- .../node/extensionLifecycle.ts | 2 +- .../node/extensionManagementService.ts | 6 +-- .../localizations/node/localizations.ts | 2 +- src/vs/workbench/electron-browser/shell.ts | 4 +- .../node/extensionsWorkbenchService.ts | 6 ++- .../services/extensions/node/rpcProtocol.ts | 9 +--- 9 files changed, 54 insertions(+), 35 deletions(-) diff --git a/src/vs/base/parts/ipc/common/ipc.ts b/src/vs/base/parts/ipc/common/ipc.ts index a3985361b63..5ebad2ea791 100644 --- a/src/vs/base/parts/ipc/common/ipc.ts +++ b/src/vs/base/parts/ipc/common/ipc.ts @@ -8,6 +8,17 @@ import { Promise, TPromise } from 'vs/base/common/winjs.base'; import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { Event, Emitter, once, filterEvent } from 'vs/base/common/event'; +import URI, { UriComponents } from 'vs/base/common/uri'; + +export interface IURITransformer { + transformIncoming(uri: UriComponents): UriComponents; + transformOutgoing(uri: URI): URI; +} + +export const DefaultURITransformer: IURITransformer = { + transformIncoming: (uri: UriComponents) => uri, + transformOutgoing: (uri: URI) => URI.revive(uri), +}; enum MessageType { RequestCommon, diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index fc191890180..02d9c7771b6 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -11,6 +11,7 @@ import { Event } from 'vs/base/common/event'; import { IPager } from 'vs/base/common/paging'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { ILocalization } from 'vs/platform/localizations/common/localizations'; +import URI from 'vs/base/common/uri'; export const EXTENSION_IDENTIFIER_PATTERN = '^([a-z0-9A-Z][a-z0-9\-A-Z]*)\\.([a-z0-9A-Z][a-z0-9\-A-Z]*)$'; export const EXTENSION_IDENTIFIER_REGEX = new RegExp(EXTENSION_IDENTIFIER_PATTERN); @@ -205,7 +206,7 @@ export interface ILocalExtension { identifier: IExtensionIdentifier; manifest: IExtensionManifest; metadata: IGalleryMetadata; - path: string; + location: URI; readmeUrl: string; changelogUrl: string; } diff --git a/src/vs/platform/extensionManagement/common/extensionManagementIpc.ts b/src/vs/platform/extensionManagement/common/extensionManagementIpc.ts index b54d3db67f2..0b5ecd87d22 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagementIpc.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagementIpc.ts @@ -6,7 +6,7 @@ 'use strict'; import { TPromise } from 'vs/base/common/winjs.base'; -import { IChannel, eventToCall, eventFromCall } from 'vs/base/parts/ipc/common/ipc'; +import { IChannel, eventToCall, eventFromCall, IURITransformer } from 'vs/base/parts/ipc/common/ipc'; import { IExtensionManagementService, ILocalExtension, InstallExtensionEvent, DidInstallExtensionEvent, IGalleryExtension, LocalExtensionType, DidUninstallExtensionEvent, IExtensionIdentifier, IGalleryMetadata, IReportedExtension } from './extensionManagement'; import { Event, buffer } from 'vs/base/common/event'; @@ -15,13 +15,13 @@ export interface IExtensionManagementChannel extends IChannel { call(command: 'event:onDidInstallExtension'): TPromise; call(command: 'event:onUninstallExtension'): TPromise; call(command: 'event:onDidUninstallExtension'): TPromise; - call(command: 'install', path: string): TPromise; - call(command: 'installFromGallery', extension: IGalleryExtension): TPromise; + call(command: 'install', args: [string]): TPromise; + call(command: 'installFromGallery', args: [IGalleryExtension]): TPromise; call(command: 'uninstall', args: [ILocalExtension, boolean]): TPromise; call(command: 'reinstallFromGallery', args: [ILocalExtension]): TPromise; - call(command: 'getInstalled'): TPromise; + call(command: 'getInstalled', args: [LocalExtensionType]): TPromise; call(command: 'getExtensionsReport'): TPromise; - call(command: string, arg?: any): TPromise; + call(command: 'updateMetadata', args: [ILocalExtension, IGalleryMetadata]): TPromise; } export class ExtensionManagementChannel implements IExtensionManagementChannel { @@ -38,18 +38,18 @@ export class ExtensionManagementChannel implements IExtensionManagementChannel { this.onDidUninstallExtension = buffer(service.onDidUninstallExtension, true); } - call(command: string, arg?: any): TPromise { + call(command: string, args?: any): TPromise { switch (command) { case 'event:onInstallExtension': return eventToCall(this.onInstallExtension); case 'event:onDidInstallExtension': return eventToCall(this.onDidInstallExtension); case 'event:onUninstallExtension': return eventToCall(this.onUninstallExtension); case 'event:onDidUninstallExtension': return eventToCall(this.onDidUninstallExtension); - case 'install': return this.service.install(arg); - case 'installFromGallery': return this.service.installFromGallery(arg[0]); - case 'uninstall': return this.service.uninstall(arg[0], arg[1]); - case 'reinstallFromGallery': return this.service.reinstallFromGallery(arg[0]); - case 'getInstalled': return this.service.getInstalled(arg); - case 'updateMetadata': return this.service.updateMetadata(arg[0], arg[1]); + case 'install': return this.service.install(args[0]); + case 'installFromGallery': return this.service.installFromGallery(args[0]); + case 'uninstall': return this.service.uninstall(args[0], args[1]); + case 'reinstallFromGallery': return this.service.reinstallFromGallery(args[0]); + case 'getInstalled': return this.service.getInstalled(args[0]); + case 'updateMetadata': return this.service.updateMetadata(args[0], args[1]); case 'getExtensionsReport': return this.service.getExtensionsReport(); } return undefined; @@ -60,7 +60,7 @@ export class ExtensionManagementChannelClient implements IExtensionManagementSer _serviceBrand: any; - constructor(private channel: IExtensionManagementChannel) { } + constructor(private channel: IExtensionManagementChannel, private uriTransformer: IURITransformer) { } private _onInstallExtension = eventFromCall(this.channel, 'event:onInstallExtension'); get onInstallExtension(): Event { return this._onInstallExtension; } @@ -75,11 +75,13 @@ export class ExtensionManagementChannelClient implements IExtensionManagementSer get onDidUninstallExtension(): Event { return this._onDidUninstallExtension; } install(zipPath: string): TPromise { - return this.channel.call('install', zipPath); + return this.channel.call('install', [zipPath]) + .then(extension => this._transform(extension)); } installFromGallery(extension: IGalleryExtension): TPromise { - return this.channel.call('installFromGallery', [extension]); + return this.channel.call('installFromGallery', [extension]) + .then(extension => this._transform(extension)); } uninstall(extension: ILocalExtension, force = false): TPromise { @@ -87,18 +89,26 @@ export class ExtensionManagementChannelClient implements IExtensionManagementSer } reinstallFromGallery(extension: ILocalExtension): TPromise { - return this.channel.call('reinstallFromGallery', [extension]); + return this.channel.call('reinstallFromGallery', [extension]) + .then(extension => this._transform(extension)); } getInstalled(type: LocalExtensionType = null): TPromise { - return this.channel.call('getInstalled', type); + return this.channel.call('getInstalled', [type]) + .then(extensions => extensions.map(extension => this._transform(extension))); } updateMetadata(local: ILocalExtension, metadata: IGalleryMetadata): TPromise { - return this.channel.call('updateMetadata', [local, metadata]); + return this.channel.call('updateMetadata', [local, metadata]) + .then(extension => this._transform(extension)); } getExtensionsReport(): TPromise { return this.channel.call('getExtensionsReport'); } + + private _transform(extension: ILocalExtension): ILocalExtension { + return { ...extension, ...{ location: this.uriTransformer.transformOutgoing(extension.location) } }; + } + } \ No newline at end of file diff --git a/src/vs/platform/extensionManagement/node/extensionLifecycle.ts b/src/vs/platform/extensionManagement/node/extensionLifecycle.ts index cbeef87b2bc..4164e676b86 100644 --- a/src/vs/platform/extensionManagement/node/extensionLifecycle.ts +++ b/src/vs/platform/extensionManagement/node/extensionLifecycle.ts @@ -42,7 +42,7 @@ export class ExtensionsLifecycle extends Disposable { this.logService.warn(extension.identifier.id, 'Uninstall script should be a node script'); return null; } - return { uninstallHook: join(extension.path, uninstallScript[1]), args: uninstallScript.slice(2) || [] }; + return { uninstallHook: join(extension.location.path, uninstallScript[1]), args: uninstallScript.slice(2) || [] }; } return null; } diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index 5d7e31e087c..ba62ff0ccfd 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -658,7 +658,7 @@ export class ExtensionManagementService extends Disposable implements IExtension } private preUninstallExtension(extension: ILocalExtension): TPromise { - return pfs.exists(extension.path) + return pfs.exists(extension.location.path) .then(exists => exists ? null : TPromise.wrapError(new Error(nls.localize('notExists', "Could not find extension")))) .then(() => { this.logService.info('Uninstalling extension:', extension.identifier.id); @@ -747,7 +747,7 @@ export class ExtensionManagementService extends Disposable implements IExtension manifest.extensionDependencies = manifest.extensionDependencies.map(id => adoptToGalleryExtensionId(id)); } const identifier = { id: type === LocalExtensionType.System ? folderName : getLocalExtensionIdFromManifest(manifest), uuid: metadata ? metadata.id : null }; - return { type, identifier, manifest, metadata, path: extensionPath, readmeUrl, changelogUrl }; + return { type, identifier, manifest, metadata, location: URI.file(extensionPath), readmeUrl, changelogUrl }; })) .then(null, () => null); } @@ -788,7 +788,7 @@ export class ExtensionManagementService extends Disposable implements IExtension private removeExtension(extension: ILocalExtension, type: string): TPromise { this.logService.trace(`Deleting ${type} extension from disk`, extension.identifier.id); - return pfs.rimraf(extension.path).then(() => this.logService.info('Deleted from disk', extension.identifier.id)); + return pfs.rimraf(extension.location.path).then(() => this.logService.info('Deleted from disk', extension.identifier.id)); } private isUninstalled(id: string): TPromise { diff --git a/src/vs/platform/localizations/node/localizations.ts b/src/vs/platform/localizations/node/localizations.ts index b736df9096d..0be53c7bbe7 100644 --- a/src/vs/platform/localizations/node/localizations.ts +++ b/src/vs/platform/localizations/node/localizations.ts @@ -151,7 +151,7 @@ class LanguagePacksCache extends Disposable { languagePack.extensions.push({ extensionIdentifier, version: extension.manifest.version }); } for (const translation of localizationContribution.translations) { - languagePack.translations[translation.id] = join(extension.path, translation.path); + languagePack.translations[translation.id] = join(extension.location.path, translation.path); } } } diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index 975def9b462..6a70ca6751e 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -60,7 +60,7 @@ import { WorkbenchModeServiceImpl } from 'vs/workbench/services/mode/common/work import { IModeService } from 'vs/editor/common/services/modeService'; import { IUntitledEditorService, UntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; import { ICrashReporterService, NullCrashReporterService, CrashReporterService } from 'vs/workbench/services/crashReporter/electron-browser/crashReporterService'; -import { getDelayedChannel, IPCClient } from 'vs/base/parts/ipc/common/ipc'; +import { getDelayedChannel, IPCClient, DefaultURITransformer } from 'vs/base/parts/ipc/common/ipc'; import { connect as connectNet } from 'vs/base/parts/ipc/node/ipc.net'; import { IExtensionManagementChannel, ExtensionManagementChannelClient } from 'vs/platform/extensionManagement/common/extensionManagementIpc'; import { IExtensionManagementService, IExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionManagement'; @@ -407,7 +407,7 @@ export class WorkbenchShell { this.lifecycleService = lifecycleService; const extensionManagementChannel = getDelayedChannel(sharedProcess.then(c => c.getChannel('extensions'))); - serviceCollection.set(IExtensionManagementService, new SyncDescriptor(ExtensionManagementChannelClient, extensionManagementChannel)); + serviceCollection.set(IExtensionManagementService, new SyncDescriptor(ExtensionManagementChannelClient, extensionManagementChannel, DefaultURITransformer)); const extensionEnablementService = instantiationService.createInstance(ExtensionEnablementService); serviceCollection.set(IExtensionEnablementService, extensionEnablementService); diff --git a/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts b/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts index d6efca764f7..5ba1c75e73e 100644 --- a/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts +++ b/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts @@ -134,8 +134,10 @@ class Extension implements IExtension { } private get localIconUrl(): string { - return this.local && this.local.manifest.icon - && URI.file(path.join(this.local.path, this.local.manifest.icon)).toString(); + if (this.local && this.local.manifest.icon) { + return this.local.location.with({ path: path.join(this.local.location.path, this.local.manifest.icon) }).toString(); + } + return null; } private get galleryIconUrl(): string { diff --git a/src/vs/workbench/services/extensions/node/rpcProtocol.ts b/src/vs/workbench/services/extensions/node/rpcProtocol.ts index f3878f3cac8..f2d7858de7e 100644 --- a/src/vs/workbench/services/extensions/node/rpcProtocol.ts +++ b/src/vs/workbench/services/extensions/node/rpcProtocol.ts @@ -6,20 +6,15 @@ import { TPromise } from 'vs/base/common/winjs.base'; import * as errors from 'vs/base/common/errors'; -import { IMessagePassingProtocol } from 'vs/base/parts/ipc/common/ipc'; +import { IMessagePassingProtocol, IURITransformer } from 'vs/base/parts/ipc/common/ipc'; import { LazyPromise } from 'vs/workbench/services/extensions/node/lazyPromise'; import { ProxyIdentifier, IRPCProtocol } from 'vs/workbench/services/extensions/node/proxyIdentifier'; import { CharCode } from 'vs/base/common/charCode'; -import URI, { UriComponents } from 'vs/base/common/uri'; +import URI from 'vs/base/common/uri'; import { MarshalledObject } from 'vs/base/common/marshalling'; declare var Proxy: any; // TODO@TypeScript -export interface IURITransformer { - transformIncoming(uri: UriComponents): UriComponents; - transformOutgoing(uri: URI): URI; -} - function _transformOutgoingURIs(obj: any, transformer: IURITransformer, depth: number): any { if (!obj || depth > 200) { -- GitLab