提交 29967e4d 编写于 作者: S Sandeep Somavarapu

Fix #55055

上级 223e91c7
...@@ -539,11 +539,14 @@ export class ExtensionManagementService extends Disposable implements IExtension ...@@ -539,11 +539,14 @@ export class ExtensionManagementService extends Disposable implements IExtension
return this.preUninstallExtension(extension) return this.preUninstallExtension(extension)
.then(() => { .then(() => {
if (force) { if (force) {
return this.uninstallExtensionAsPack(extension, installed); return this.uninstallExtensionWithDependenciesAndPacked(extension, installed);
}
const dependencies = this.getDependenciesToUninstall(extension, installed);
if (dependencies.length) {
return this.promptForDependenciesAndUninstall(extension, installed);
} else {
return this.uninstallExtensionWithDependenciesAndPacked(extension, installed);
} }
const hasInstalledExtensionPack = extension.manifest.extensionPack && extension.manifest.extensionPack.length && installed.some(i => extension.manifest.extensionPack.some(dep => areSameExtensions({ id: dep }, i.galleryIdentifier)));
const hasDependencies = extension.manifest.extensionDependencies && extension.manifest.extensionDependencies.length > 0;
return hasInstalledExtensionPack || hasDependencies ? this.promptForPackAndUninstall(extension, installed) : this.uninstallExtensions(extension, [], installed);
}) })
.then(() => this.postUninstallExtension(extension), .then(() => this.postUninstallExtension(extension),
error => { error => {
...@@ -552,27 +555,27 @@ export class ExtensionManagementService extends Disposable implements IExtension ...@@ -552,27 +555,27 @@ export class ExtensionManagementService extends Disposable implements IExtension
}); });
} }
private promptForPackAndUninstall(extension: ILocalExtension, installed: ILocalExtension[]): TPromise<void> { private promptForDependenciesAndUninstall(extension: ILocalExtension, installed: ILocalExtension[]): TPromise<void> {
const message = nls.localize('uninstallExtensionPackConfirmation', "Would you like to uninstall '{0}' only or as a pack?", extension.manifest.displayName || extension.manifest.name); const message = nls.localize('uninstallDependeciesConfirmation', "Would you like to uninstall '{0}' only or its dependencies also?", extension.manifest.displayName || extension.manifest.name);
const buttons = [ const buttons = [
nls.localize('uninstallPack', "Uninstall Extension Pack"), nls.localize('uninstallOnly', "Extension Only"),
nls.localize('uninstallOnly', "Uninstall Extension Only"), nls.localize('uninstallAll', "Uninstall All"),
nls.localize('cancel', "Cancel") nls.localize('cancel', "Cancel")
]; ];
return this.dialogService.show(Severity.Info, message, buttons, { cancelId: 2 }) return this.dialogService.show(Severity.Info, message, buttons, { cancelId: 2 })
.then<void>(value => { .then<void>(value => {
if (value === 0) { if (value === 0) {
return this.uninstallExtensionAsPack(extension, installed); return this.uninstallExtensions(extension, [], installed);
} }
if (value === 1) { if (value === 1) {
return this.uninstallExtensions(extension, [], installed); return this.uninstallExtensionWithDependenciesAndPacked(extension, installed);
} }
this.logService.info('Cancelled uninstalling extension:', extension.identifier.id); this.logService.info('Cancelled uninstalling extension:', extension.identifier.id);
return TPromise.wrapError(errors.canceled()); return TPromise.wrapError(errors.canceled());
}, error => TPromise.wrapError(errors.canceled())); }, error => TPromise.wrapError(errors.canceled()));
} }
private uninstallExtensionAsPack(extension: ILocalExtension, installed: ILocalExtension[]): TPromise<void> { private uninstallExtensionWithDependenciesAndPacked(extension: ILocalExtension, installed: ILocalExtension[]): TPromise<void> {
const extensionsToUninstall = this.getDependenciesToUninstall(extension, installed); const extensionsToUninstall = this.getDependenciesToUninstall(extension, installed);
for (const packExtensionToUninstall of this.getAllPackExtensionsToUninstall(extension, installed)) { for (const packExtensionToUninstall of this.getAllPackExtensionsToUninstall(extension, installed)) {
if (extensionsToUninstall.indexOf(packExtensionToUninstall) === -1) { if (extensionsToUninstall.indexOf(packExtensionToUninstall) === -1) {
......
...@@ -742,38 +742,45 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService, ...@@ -742,38 +742,45 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService,
} }
private promptAndSetEnablement(extensions: IExtension[], enablementState: EnablementState): TPromise<any> { private promptAndSetEnablement(extensions: IExtension[], enablementState: EnablementState): TPromise<any> {
const allDependenciesAndPackedExtensions = this.getDependenciesAndPackedExtensionsRecursively(extensions, this.local, enablementState); const enable = enablementState === EnablementState.Enabled || enablementState === EnablementState.WorkspaceEnabled;
if (allDependenciesAndPackedExtensions.length > 0) { if (enable) {
if (extensions.length === 1 && (enablementState === EnablementState.Disabled || enablementState === EnablementState.WorkspaceDisabled)) { return this.checkAndSetEnablementWithDependenciesAndPacked(extensions, enablementState);
return this.promptForDependenciesAndDisable(extensions[0], allDependenciesAndPackedExtensions, enablementState); } else {
const dependencies = this.getExtensionsRecursively(extensions, this.local, enablementState, { dependencies: true, pack: false });
if (dependencies.length) {
return this.promptForDependenciesAndDisable(extensions, enablementState);
} else { } else {
return this.checkAndSetEnablement(extensions, allDependenciesAndPackedExtensions, enablementState); return this.checkAndSetEnablementWithDependenciesAndPacked(extensions, enablementState);
} }
} }
return this.checkAndSetEnablement(extensions, [], enablementState);
} }
private promptForDependenciesAndDisable(extension: IExtension, dependencies: IExtension[], enablementState: EnablementState): TPromise<void> { private promptForDependenciesAndDisable(extensions: IExtension[], enablementState: EnablementState): TPromise<void> {
const message = nls.localize('disableExtensionPackConfirmation', "Would you like to disable '{0}' only or as a pack?", extension.displayName); const message = nls.localize('disableDependeciesConfirmation', "Would you like to disable the dependencies of the extensions also?");
const buttons = [ const buttons = [
nls.localize('disablePack', "Disable Extension Pack"), nls.localize('yes', "Yes"),
nls.localize('disableOnly', "Disable Extension Only"), nls.localize('no', "No"),
nls.localize('cancel', "Cancel") nls.localize('cancel', "Cancel")
]; ];
return this.dialogService.show(Severity.Info, message, buttons) return this.dialogService.show(Severity.Info, message, buttons, { cancelId: 2 })
.then<void>(value => { .then<void>(value => {
if (value === 0) { if (value === 0) {
return this.checkAndSetEnablement([extension], dependencies, enablementState); return this.checkAndSetEnablementWithDependenciesAndPacked(extensions, enablementState);
} }
if (value === 1) { if (value === 1) {
return this.checkAndSetEnablement([extension], [], enablementState); return this.checkAndSetEnablement(extensions, [], enablementState);
} }
return TPromise.as(null); return TPromise.as(null);
}); });
} }
private checkAndSetEnablement(extensions: IExtension[], dependencies: IExtension[], enablementState: EnablementState): TPromise<any> { private checkAndSetEnablementWithDependenciesAndPacked(extensions: IExtension[], enablementState: EnablementState): TPromise<any> {
const allExtensions = [...extensions, ...dependencies]; const otherExtensions = this.getExtensionsRecursively(extensions, this.local, enablementState, { dependencies: true, pack: true });
return this.checkAndSetEnablement(extensions, otherExtensions, enablementState);
}
private checkAndSetEnablement(extensions: IExtension[], otherExtensions: IExtension[], enablementState: EnablementState): TPromise<any> {
const allExtensions = [...extensions, ...otherExtensions];
const enable = enablementState === EnablementState.Enabled || enablementState === EnablementState.WorkspaceEnabled; const enable = enablementState === EnablementState.Enabled || enablementState === EnablementState.WorkspaceEnabled;
if (!enable) { if (!enable) {
for (const extension of extensions) { for (const extension of extensions) {
...@@ -786,7 +793,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService, ...@@ -786,7 +793,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService,
return TPromise.join(allExtensions.map(e => this.doSetEnablement(e, enablementState))); return TPromise.join(allExtensions.map(e => this.doSetEnablement(e, enablementState)));
} }
private getDependenciesAndPackedExtensionsRecursively(extensions: IExtension[], installed: IExtension[], enablementState: EnablementState, checked: IExtension[] = []): IExtension[] { private getExtensionsRecursively(extensions: IExtension[], installed: IExtension[], enablementState: EnablementState, options: { dependencies: boolean, pack: boolean }, checked: IExtension[] = []): IExtension[] {
const toCheck = extensions.filter(e => checked.indexOf(e) === -1); const toCheck = extensions.filter(e => checked.indexOf(e) === -1);
if (toCheck.length) { if (toCheck.length) {
for (const extension of toCheck) { for (const extension of toCheck) {
...@@ -799,11 +806,15 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService, ...@@ -799,11 +806,15 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService,
if (i.enablementState === enablementState) { if (i.enablementState === enablementState) {
return false; return false;
} }
return i.type === LocalExtensionType.User && return i.type === LocalExtensionType.User
extensions.some(extension => extension.dependencies.some(id => areSameExtensions({ id }, i)) || extension.extensionPack.some(id => areSameExtensions({ id }, i))); && (options.dependencies || options.pack)
&& extensions.some(extension =>
(options.dependencies && extension.dependencies.some(id => areSameExtensions({ id }, i)))
|| (options.pack && extension.extensionPack.some(id => areSameExtensions({ id }, i)))
);
}); });
if (extensionsToDisable.length) { if (extensionsToDisable.length) {
extensionsToDisable.push(...this.getDependenciesAndPackedExtensionsRecursively(extensionsToDisable, installed, enablementState, checked)); extensionsToDisable.push(...this.getExtensionsRecursively(extensionsToDisable, installed, enablementState, options, checked));
} }
return extensionsToDisable; return extensionsToDisable;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册