Skip to content

Commit 171b9ac

Browse files
committed
Revert "use fileservice.del (microsoft#181890)"
This reverts commit 618dc85.
1 parent 4b0d659 commit 171b9ac

File tree

1 file changed

+38
-2
lines changed

1 file changed

+38
-2
lines changed

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

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import { joinPath } from 'vs/base/common/resources';
1919
import * as semver from 'vs/base/common/semver/semver';
2020
import { isBoolean, isUndefined } from 'vs/base/common/types';
2121
import { URI } from 'vs/base/common/uri';
22-
import { generateUuid } from 'vs/base/common/uuid';
22+
import { generateUuid, isUUID } from 'vs/base/common/uuid';
2323
import * as pfs from 'vs/base/node/pfs';
2424
import { extract, ExtractError, IFile, zip } from 'vs/base/node/zip';
2525
import * as nls from 'vs/nls';
@@ -409,11 +409,14 @@ export class ExtensionsScanner extends Disposable {
409409
private readonly _onExtract = this._register(new Emitter<URI>());
410410
readonly onExtract = this._onExtract.event;
411411

412+
private cleanUpGeneratedFoldersPromise: Promise<void> = Promise.resolve();
413+
412414
constructor(
413415
private readonly beforeRemovingExtension: (e: ILocalExtension) => Promise<void>,
414416
@IFileService private readonly fileService: IFileService,
415417
@IExtensionsScannerService private readonly extensionsScannerService: IExtensionsScannerService,
416418
@IExtensionsProfileScannerService private readonly extensionsProfileScannerService: IExtensionsProfileScannerService,
419+
@IUriIdentityService private readonly uriIdentityService: IUriIdentityService,
417420
@ILogService private readonly logService: ILogService,
418421
) {
419422
super();
@@ -423,6 +426,8 @@ export class ExtensionsScanner extends Disposable {
423426

424427
async cleanUp(): Promise<void> {
425428
await this.removeUninstalledExtensions();
429+
this.cleanUpGeneratedFoldersPromise = this.cleanUpGeneratedFoldersPromise.then(() => this.removeGeneratedFolders());
430+
await this.cleanUpGeneratedFoldersPromise;
426431
}
427432

428433
async scanExtensions(type: ExtensionType | null, profileLocation: URI): Promise<ILocalExtension[]> {
@@ -455,6 +460,8 @@ export class ExtensionsScanner extends Disposable {
455460
}
456461

457462
async extractUserExtension(extensionKey: ExtensionKey, zipPath: string, metadata: Metadata, token: CancellationToken): Promise<ILocalExtension> {
463+
await this.cleanUpGeneratedFoldersPromise.catch(() => undefined);
464+
458465
const folderName = extensionKey.toString();
459466
const tempPath = path.join(this.extensionsScannerService.userExtensionsLocation.fsPath, `.${generateUuid()}`);
460467
const extensionPath = path.join(this.extensionsScannerService.userExtensionsLocation.fsPath, folderName);
@@ -524,7 +531,9 @@ export class ExtensionsScanner extends Disposable {
524531

525532
async removeExtension(extension: ILocalExtension | IScannedExtension, type: string): Promise<void> {
526533
this.logService.trace(`Deleting ${type} extension from disk`, extension.identifier.id, extension.location.fsPath);
527-
await this.fileService.del(extension.location, { recursive: true });
534+
const renamedLocation = this.uriIdentityService.extUri.joinPath(this.uriIdentityService.extUri.dirname(extension.location), `.${generateUuid()}`);
535+
await this.rename(extension.identifier, extension.location.fsPath, renamedLocation.fsPath, Date.now() + (2 * 60 * 1000) /* Retry for 2 minutes */);
536+
await this.fileService.del(renamedLocation, { recursive: true });
528537
this.logService.info('Deleted from disk', extension.identifier.id, extension.location.fsPath);
529538
}
530539

@@ -685,6 +694,33 @@ export class ExtensionsScanner extends Disposable {
685694
await Promise.allSettled(toRemove.map(e => this.removeUninstalledExtension(e)));
686695
}
687696

697+
private async removeGeneratedFolders(): Promise<void> {
698+
this.logService.trace('ExtensionManagementService#removeGeneratedFolders');
699+
const promises: Promise<any>[] = [];
700+
let stat;
701+
try {
702+
stat = await this.fileService.resolve(this.extensionsScannerService.userExtensionsLocation);
703+
} catch (error) {
704+
if (toFileOperationResult(error) !== FileOperationResult.FILE_NOT_FOUND) {
705+
this.logService.error(error);
706+
}
707+
}
708+
for (const child of stat?.children ?? []) {
709+
if (child.isDirectory && child.name.startsWith('.') && isUUID(child.name.substring(1))) {
710+
promises.push((async () => {
711+
this.logService.trace('Deleting the generated extension folder', child.resource.toString());
712+
try {
713+
await this.fileService.del(child.resource, { recursive: true });
714+
this.logService.info('Deleted the generated extension folder', child.resource.toString());
715+
} catch (error) {
716+
this.logService.error(error);
717+
}
718+
})());
719+
}
720+
}
721+
await Promise.allSettled(promises);
722+
}
723+
688724
private joinErrors(errorOrErrors: (Error | string) | (Array<Error | string>)): Error {
689725
const errors = Array.isArray(errorOrErrors) ? errorOrErrors : [errorOrErrors];
690726
if (errors.length === 1) {

0 commit comments

Comments
 (0)