Skip to content

Commit 81ad7ac

Browse files
authored
Merge pull request #102948 from microsoft/sandy081/fix100323
Fix - Await until uninstall hook is finished before removing extension
2 parents 17299e4 + b0dd050 commit 81ad7ac

File tree

3 files changed

+7
-11
lines changed

3 files changed

+7
-11
lines changed

src/vs/platform/extensionManagement/node/extensionLifecycle.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,15 @@ import { Event } from 'vs/base/common/event';
1414
import { Schemas } from 'vs/base/common/network';
1515
import { INativeEnvironmentService } from 'vs/platform/environment/node/environmentService';
1616
import { rimraf } from 'vs/base/node/pfs';
17+
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
1718

1819
export class ExtensionsLifecycle extends Disposable {
1920

2021
private processesLimiter: Limiter<void> = new Limiter(5); // Run max 5 processes in parallel
2122

2223
constructor(
23-
private environmentService: INativeEnvironmentService,
24-
private logService: ILogService
24+
@IEnvironmentService private environmentService: INativeEnvironmentService,
25+
@ILogService private readonly logService: ILogService
2526
) {
2627
super();
2728
}

src/vs/platform/extensionManagement/node/extensionManagementService.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,8 @@ export class ExtensionManagementService extends Disposable implements IExtension
9393
@IInstantiationService instantiationService: IInstantiationService,
9494
) {
9595
super();
96-
this.extensionsScanner = this._register(instantiationService.createInstance(ExtensionsScanner));
96+
const extensionLifecycle = this._register(instantiationService.createInstance(ExtensionsLifecycle));
97+
this.extensionsScanner = this._register(instantiationService.createInstance(ExtensionsScanner, extension => extensionLifecycle.postUninstall(extension)));
9798
this.manifestCache = this._register(new ExtensionsManifestCache(environmentService, this));
9899
this.extensionsDownloader = this._register(instantiationService.createInstance(ExtensionsDownloader));
99100

@@ -103,9 +104,6 @@ export class ExtensionManagementService extends Disposable implements IExtension
103104
this.installingExtensions.clear();
104105
this.uninstallingExtensions.clear();
105106
}));
106-
107-
const extensionLifecycle = this._register(new ExtensionsLifecycle(environmentService, this.logService));
108-
this._register(this.extensionsScanner.onDidRemoveExtension(extension => extensionLifecycle.postUninstall(extension)));
109107
}
110108

111109
zip(extension: ILocalExtension): Promise<URI> {

src/vs/platform/extensionManagement/node/extensionsScanner.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import { CancellationToken } from 'vscode';
2323
import { extract, ExtractError } from 'vs/base/node/zip';
2424
import { isWindows } from 'vs/base/common/platform';
2525
import { flatten } from 'vs/base/common/arrays';
26-
import { Emitter } from 'vs/base/common/event';
2726
import { assign } from 'vs/base/common/objects';
2827

2928
const ERROR_SCANNING_SYS_EXTENSIONS = 'scanningSystem';
@@ -41,10 +40,8 @@ export class ExtensionsScanner extends Disposable {
4140
private readonly uninstalledPath: string;
4241
private readonly uninstalledFileLimiter: Queue<any>;
4342

44-
private _onDidRemoveExtension = new Emitter<ILocalExtension>();
45-
readonly onDidRemoveExtension = this._onDidRemoveExtension.event;
46-
4743
constructor(
44+
private readonly beforeRemovingExtension: (e: ILocalExtension) => Promise<void>,
4845
@ILogService private readonly logService: ILogService,
4946
@IEnvironmentService private readonly environmentService: INativeEnvironmentService,
5047
@IProductService private readonly productService: IProductService,
@@ -280,7 +277,7 @@ export class ExtensionsScanner extends Disposable {
280277
await Promise.all(byExtension.map(async e => {
281278
const latest = e.sort((a, b) => semver.rcompare(a.manifest.version, b.manifest.version))[0];
282279
if (!installed.has(latest.identifier.id.toLowerCase())) {
283-
this._onDidRemoveExtension.fire(latest);
280+
await this.beforeRemovingExtension(latest);
284281
}
285282
}));
286283
const toRemove: ILocalExtension[] = extensions.filter(e => uninstalled[new ExtensionIdentifierWithVersion(e.identifier, e.manifest.version).key()]);

0 commit comments

Comments
 (0)