From 7d0460f83f4d36cdefd897846a6bd1fb02c0767e Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 13 Oct 2016 09:11:06 +0200 Subject: [PATCH] improve ext obsolete detection at loading time related to #13603 --- src/vs/workbench/node/extensionPoints.ts | 38 ++++++++++++++++++++---- 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/node/extensionPoints.ts b/src/vs/workbench/node/extensionPoints.ts index 6005ded2d10..e57b7488523 100644 --- a/src/vs/workbench/node/extensionPoints.ts +++ b/src/vs/workbench/node/extensionPoints.ts @@ -278,14 +278,40 @@ export class ExtensionScanner { return obsolete.then(obsolete => { return pfs.readDirsInDir(absoluteFolderPath) + .then(folders => { + if (isBuiltin) { + return folders; + } + + // TODO: align with extensionsService + const nonGallery: string[] = []; + const gallery: { folder: string; id: string; version: string; }[] = []; + + folders.forEach(folder => { + if (obsolete[folder]) { + return; + } + + const match = /^([^.]+\..+)-(\d+\.\d+\.\d+)$/.exec(folder); + + if (!match) { + nonGallery.push(folder); + return; + } + + const id = match[1]; + const version = match[2]; + gallery.push({ folder, id, version }); + }); + + const byId = values(groupBy(gallery, p => p.id)); + const latest = byId.map(p => p.sort((a, b) => semver.rcompare(a.version, b.version))[0]) + .map(a => a.folder); + + return [...nonGallery, ...latest]; + }) .then(folders => TPromise.join(folders.map(f => this.scanExtension(version, collector, paths.join(absoluteFolderPath, f), isBuiltin)))) .then(extensionDescriptions => extensionDescriptions.filter(item => item !== null)) - // TODO: align with extensionsService - .then(extensionDescriptions => extensionDescriptions.filter(p => !obsolete[`${p.publisher}.${p.name}-${p.version}`])) - .then(extensionDescriptions => { - const extensionDescriptionsById = values(groupBy(extensionDescriptions, p => p.id)); - return extensionDescriptionsById.map(p => p.sort((a, b) => semver.rcompare(a.version, b.version))[0]); - }) .then(null, err => { collector.error(absoluteFolderPath, err); return [];