diff --git a/src/vs/code/node/cliProcessMain.ts b/src/vs/code/node/cliProcessMain.ts index 38b0cc0f768ec4d8ff4cded3cb174224b14241df..5b5c84c0be986f6bca1913b17061a2b04fffa283 100644 --- a/src/vs/code/node/cliProcessMain.ts +++ b/src/vs/code/node/cliProcessMain.ts @@ -122,7 +122,7 @@ class Main { console.log(localize('foundExtension', "Found '{0}' in the marketplace.", id)); console.log(localize('installing', "Installing...")); - return this.extensionManagementService.installFromGallery(extension) + return this.extensionManagementService.installFromGallery(extension, false) .then(() => console.log(localize('successInstall', "Extension '{0}' v{1} was successfully installed!", id, extension.version))); }); }); @@ -142,7 +142,7 @@ class Main { console.log(localize('uninstalling', "Uninstalling {0}...", id)); - return this.extensionManagementService.uninstall(extension) + return this.extensionManagementService.uninstall(extension, true) .then(() => console.log(localize('successUninstall', "Extension '{0}' was successfully uninstalled!", id))); }); })); diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index 963d11f302941c2ec4d22818bab257fc0bfb51ea..3f4d683feaf41f02887815d6aa02301545ee3ec7 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -237,7 +237,7 @@ export interface IExtensionManagementService { install(zipPath: string): TPromise; installFromGallery(extension: IGalleryExtension, promptToInstallDependencies?: boolean): TPromise; - uninstall(extension: ILocalExtension): TPromise; + uninstall(extension: ILocalExtension, force?: boolean): TPromise; getInstalled(type?: LocalExtensionType): TPromise; } diff --git a/src/vs/platform/extensionManagement/common/extensionManagementIpc.ts b/src/vs/platform/extensionManagement/common/extensionManagementIpc.ts index 20dc457855a011a7093a91b651f7423ae2de675b..ecdb8c088165b0157c81d4375ed6831105fee7cc 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagementIpc.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagementIpc.ts @@ -17,7 +17,7 @@ export interface IExtensionManagementChannel extends IChannel { call(command: 'event:onDidUninstallExtension'): TPromise; call(command: 'install', path: string): TPromise; call(command: 'installFromGallery', extension: IGalleryExtension): TPromise; - call(command: 'uninstall', extension: ILocalExtension): TPromise; + call(command: 'uninstall', args: [ILocalExtension, boolean]): TPromise; call(command: 'getInstalled'): TPromise; call(command: string, arg?: any): TPromise; } @@ -44,7 +44,7 @@ export class ExtensionManagementChannel implements IExtensionManagementChannel { case 'event:onDidUninstallExtension': return eventToCall(this.onDidUninstallExtension); case 'install': return this.service.install(arg); case 'installFromGallery': return this.service.installFromGallery(arg[0], arg[1]); - case 'uninstall': return this.service.uninstall(arg); + case 'uninstall': return this.service.uninstall(arg[0], arg[1]); case 'getInstalled': return this.service.getInstalled(arg); } return undefined; @@ -77,8 +77,8 @@ export class ExtensionManagementChannelClient implements IExtensionManagementSer return this.channel.call('installFromGallery', [extension, promptToInstallDependencies]); } - uninstall(extension: ILocalExtension): TPromise { - return this.channel.call('uninstall', extension); + uninstall(extension: ILocalExtension, force = false): TPromise { + return this.channel.call('uninstall', [extension, force]); } getInstalled(type: LocalExtensionType = null): TPromise { diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index 280f28b41838949c8290100cb6d47ff735f616d6..9e8ec4533ccfe92c992765be7595d6b127ef3d18 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -290,20 +290,20 @@ export class ExtensionManagementService implements IExtensionManagementService { }); } - uninstall(extension: ILocalExtension): TPromise { + uninstall(extension: ILocalExtension, force = false): TPromise { return this.removeOutdatedExtensions().then(() => { return this.scanUserExtensions().then(installed => { const promises = installed .filter(e => e.manifest.publisher === extension.manifest.publisher && e.manifest.name === extension.manifest.name) - .map(e => this.checkForDependenciesAndUninstall(e, installed)); + .map(e => this.checkForDependenciesAndUninstall(e, installed, force)); return TPromise.join(promises); }); }); } - private checkForDependenciesAndUninstall(extension: ILocalExtension, installed: ILocalExtension[]): TPromise { + private checkForDependenciesAndUninstall(extension: ILocalExtension, installed: ILocalExtension[], force: boolean): TPromise { return this.preUninstallExtension(extension.id) - .then(() => this.hasDependencies(extension, installed) ? this.promptForDependenciesAndUninstall(extension, installed) : this.promptAndUninstall(extension, installed)) + .then(() => this.hasDependencies(extension, installed) ? this.promptForDependenciesAndUninstall(extension, installed, force) : this.promptAndUninstall(extension, installed, force)) .then(() => this.postUninstallExtension(extension.id), error => { this.postUninstallExtension(extension.id, error); @@ -318,7 +318,12 @@ export class ExtensionManagementService implements IExtensionManagementService { return false; } - private promptForDependenciesAndUninstall(extension: ILocalExtension, installed: ILocalExtension[]): TPromise { + private promptForDependenciesAndUninstall(extension: ILocalExtension, installed: ILocalExtension[], force: boolean): TPromise { + if (force) { + const dependencies = distinct(this.getDependenciesToUninstallRecursively(extension, installed, [])).filter(e => e !== extension); + return this.uninstallWithDependencies(extension, dependencies, installed); + } + const message = nls.localize('uninstallDependeciesConfirmation', "Would you like to uninstall '{0}' only or its dependencies also?", extension.manifest.displayName || extension.manifest.name); const options = [ nls.localize('uninstallOnly', "Only"), @@ -338,7 +343,11 @@ export class ExtensionManagementService implements IExtensionManagementService { }, error => TPromise.wrapError(errors.canceled())); } - private promptAndUninstall(extension: ILocalExtension, installed: ILocalExtension[]): TPromise { + private promptAndUninstall(extension: ILocalExtension, installed: ILocalExtension[], force: boolean): TPromise { + if (force) { + return this.uninstallWithDependencies(extension, [], installed); + } + const message = nls.localize('uninstallConfirmation', "Are you sure you want to uninstall '{0}'?", extension.manifest.displayName || extension.manifest.name); const options = [ nls.localize('ok', "Ok"),