load latest extension version

fixes #1111
This commit is contained in:
Joao Moreno
2015-12-16 08:34:08 +00:00
parent c27759dd48
commit 0f800b76cf
8 changed files with 83 additions and 30 deletions

View File

@@ -5,19 +5,15 @@
'use strict';
import nls = require('vs/nls');
import fs = require('fs');
import pfs = require('vs/base/node/pfs');
import {IPluginDescription} from 'vs/platform/plugins/common/plugins';
import {TPromise} from 'vs/base/common/winjs.base';
import {groupBy, values} from 'vs/base/common/collections';
import paths = require('vs/base/common/paths');
import json = require('vs/base/common/json');
import strings = require('vs/base/common/strings');
import {ILanguageExtensionPoint} from 'vs/editor/common/modes/languageExtensionPoint';
import {PluginsRegistry, IPluginsMessageCollector} from 'vs/platform/plugins/common/pluginsRegistry';
import {IPluginsMessageCollector} from 'vs/platform/plugins/common/pluginsRegistry';
import {isValidPluginDescription} from 'vs/platform/plugins/node/pluginVersionValidator';
import * as semver from 'semver';
const MANIFEST_FILE = 'package.json';
@@ -26,7 +22,13 @@ export class PluginScanner {
/**
* Scan the plugin defined in `absoluteFolderPath`
*/
public static scanPlugin(version: string, collector: IPluginsMessageCollector, absoluteFolderPath:string, isBuiltin:boolean): TPromise<IPluginDescription> {
public static scanPlugin(
version: string,
collector: IPluginsMessageCollector,
absoluteFolderPath:string,
isBuiltin:boolean
) : TPromise<IPluginDescription>
{
absoluteFolderPath = paths.normalize(absoluteFolderPath);
let builder = collector.scopeTo(absoluteFolderPath);
let absoluteManifestPath = paths.join(absoluteFolderPath, MANIFEST_FILE);
@@ -81,22 +83,37 @@ export class PluginScanner {
/**
* Scan a list of extensions defined in `absoluteFolderPath`
*/
public static scanPlugins(version: string, collector: IPluginsMessageCollector, absoluteFolderPath:string, isBuiltin:boolean): TPromise<IPluginDescription[]> {
return pfs.readDirsInDir(absoluteFolderPath).then((folders) => {
return TPromise.join(
folders.map((folder) => this.scanPlugin(version, collector, paths.join(absoluteFolderPath, folder), isBuiltin))
);
}, (err) => {
collector.error(absoluteFolderPath, err);
return [];
}).then((results) => results.filter(item => (item !== null)));
public static scanPlugins(
version: string,
collector: IPluginsMessageCollector,
absoluteFolderPath:string,
isBuiltin:boolean
) : TPromise<IPluginDescription[]>
{
return pfs.readDirsInDir(absoluteFolderPath)
.then(folders => TPromise.join(folders.map(f => this.scanPlugin(version, collector, paths.join(absoluteFolderPath, f), isBuiltin))))
.then(plugins => plugins.filter(item => item !== null))
.then(plugins => {
const pluginsById = values(groupBy(plugins, p => p.id));
return pluginsById.map(p => p.sort((a, b) => semver.rcompare(a.version, b.version))[0]);
})
.then(null, err => {
collector.error(absoluteFolderPath, err);
return [];
});
}
/**
* Combination of scanPlugin and scanPlugins: If a plugin manifest is found at root, we load just this plugin, otherwise we assume
* the folder contains multiple extensions.
*/
public static scanOneOrMultiplePlugins(version: string, collector: IPluginsMessageCollector, absoluteFolderPath:string, isBuiltin:boolean): TPromise<IPluginDescription[]> {
public static scanOneOrMultiplePlugins(
version: string,
collector: IPluginsMessageCollector,
absoluteFolderPath:string,
isBuiltin:boolean
) : TPromise<IPluginDescription[]>
{
return pfs.fileExists(paths.join(absoluteFolderPath, MANIFEST_FILE)).then((exists) => {
if (exists) {
return this.scanPlugin(version, collector, absoluteFolderPath, isBuiltin).then((pluginDescription) => {

View File

@@ -162,10 +162,9 @@ export class PluginHostMain {
}
private static scanPlugins(collector: IPluginsMessageCollector, builtinPluginsPath: string, userInstallPath: string, pluginDevelopmentPath: string, version: string): TPromise<IPluginDescription[]> {
let builtinPlugins: TPromise<IPluginDescription[]> = PluginScanner.scanPlugins(version, collector, builtinPluginsPath, true);
let userPlugins: TPromise<IPluginDescription[]> = (userInstallPath ? PluginScanner.scanPlugins(version, collector, userInstallPath, false) : TPromise.as([]));
let developedPlugins: TPromise<IPluginDescription[]> = (pluginDevelopmentPath ? PluginScanner.scanOneOrMultiplePlugins(version, collector, pluginDevelopmentPath, false) : TPromise.as([]));
const builtinPlugins = PluginScanner.scanPlugins(version, collector, builtinPluginsPath, true);
const userPlugins = !userInstallPath ? TPromise.as([]) : PluginScanner.scanPlugins(version, collector, userInstallPath, false);
const developedPlugins = !pluginDevelopmentPath ? TPromise.as([]) : PluginScanner.scanOneOrMultiplePlugins(version, collector, pluginDevelopmentPath, false);
return TPromise.join([builtinPlugins, userPlugins, developedPlugins]).then((_: IPluginDescription[][]) => {
let builtinPlugins = _[0];