mirror of
https://github.com/microsoft/vscode.git
synced 2026-04-26 11:38:51 +01:00
@@ -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) => {
|
||||
|
||||
@@ -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];
|
||||
|
||||
Reference in New Issue
Block a user