Skip to content

Commit 22d1786

Browse files
committed
[Plugin] plugin -i to install all missing plugins.
Signed-off-by: Eric Wang <[email protected]>
1 parent fc29d65 commit 22d1786

File tree

3 files changed

+93
-32
lines changed

3 files changed

+93
-32
lines changed

lib/cli.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ var _ = require('underscore');
44
var chalk = require('./chalk');
55
var cache = require('./cache');
66
var config = require('./config');
7-
var core = require('./core');
87
var h = require('./helper');
98
var icon = require('./icon');
109
var log = require('./log');
@@ -63,8 +62,7 @@ cli.run = function() {
6362
initIcon();
6463
initLogLevel();
6564

66-
if (Plugin.init(core))
67-
Plugin.save();
65+
Plugin.init() && Plugin.save();
6866

6967
process.stdout.on('error', function(e) {
7068
if (e.code === 'EPIPE') process.exit();

lib/commands/plugin.js

+45-19
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
'use strict';
2-
var fs = require('fs');
3-
42
var sprintf = require('sprintf-js').sprintf;
53

64
var h = require('../helper');
75
var chalk = require('../chalk');
86
var config = require('../config');
97
var log = require('../log');
108
var Plugin = require('../plugin');
9+
var Queue = require('../queue');
1110
var session = require('../session');
1211

1312
const cmd = {
@@ -55,59 +54,86 @@ const cmd = {
5554
.example(chalk.yellow('leetcode plugin company'), 'Show company plugin')
5655
.example(chalk.yellow('leetcode plugin company -c'), 'Show config of company plugin')
5756
.example('', '')
57+
.example(chalk.yellow('leetcode plugin -i'), 'Install all missing plugins from GtiHub')
5858
.example(chalk.yellow('leetcode plugin -i company'), 'Install company plugin from GtiHub')
5959
.example(chalk.yellow('leetcode plugin -d company'), 'Disable company plugin')
6060
.example(chalk.yellow('leetcode plugin -e company'), 'Enable comapny plugin')
6161
.example(chalk.yellow('leetcode plugin -D company'), 'Delete company plugin');
6262
}
6363
};
6464

65-
function printPlugins(plugins) {
65+
function print(plugins) {
6666
log.info(chalk.gray(sprintf(' %6s %-18s %-15s %s', 'Active', 'Name', 'Version', 'Desc')));
6767
log.info(chalk.gray('-'.repeat(100)));
6868

6969
plugins = plugins || Plugin.plugins;
7070
for (let p of plugins)
7171
log.printf(' %s %-18s %-15s %s',
72-
h.prettyText('', p.enabled), p.name, p.ver, p.desc);
72+
h.prettyText('', p.enabled && !p.missing),
73+
p.name, p.ver, p.desc);
7374
Plugin.save();
7475
}
7576

77+
function install(plugins) {
78+
function doTask(plugin, queue, cb) {
79+
Plugin.install(plugin.name, function(e, p) {
80+
if (!e) {
81+
p.enable(plugin.enabled);
82+
p.save();
83+
p.help();
84+
}
85+
return cb(e);
86+
});
87+
}
88+
89+
const q = new Queue(plugins, {}, doTask);
90+
q.run(1, function(e) {
91+
if (e) return log.fail(e);
92+
Plugin.init();
93+
print();
94+
});
95+
}
96+
7697
cmd.handler = function(argv) {
7798
session.argv = argv;
7899

100+
let plugins = Plugin.plugins;
79101
const name = argv.name;
102+
80103
if (argv.install) {
81-
Plugin.install(name, function(e, plugin) {
82-
if (e) return log.error(e);
83-
plugin.help();
84-
});
104+
if (name) {
105+
install([new Plugin(-1, name, 'missing')]);
106+
} else {
107+
plugins = plugins.filter(x => x.missing);
108+
install(plugins);
109+
}
85110
return;
86111
}
87112

88-
let plugins = Plugin.plugins;
89-
if (name) {
90-
plugins = plugins.filter(x => x.name === name);
91-
}
113+
if (name) plugins = plugins.filter(x => x.name === name);
92114
if (plugins.length === 0) return log.error('Plugin not found!');
93115

94116
const plugin = plugins[0];
95-
const fullpath = h.getPluginFile(plugin.file);
117+
if (plugin.missing && (argv.enable || argv.disable))
118+
return log.error('Plugin missing, install it first');
96119

97120
if (argv.enable) {
98121
plugin.enable(true);
99-
printPlugins();
122+
plugin.save();
123+
print();
100124
} else if (argv.disable) {
101125
plugin.enable(false);
102-
printPlugins();
126+
plugin.save();
127+
print();
103128
} else if (argv.delete) {
104-
fs.unlink(fullpath, function(e) {
105-
if (e) log.error(e.message);
106-
});
129+
plugin.delete();
130+
plugin.save();
131+
Plugin.init();
132+
print();
107133
} else if (argv.config) {
108134
log.info(JSON.stringify(config.plugins[name] || {}, null, 2));
109135
} else {
110-
printPlugins(plugins);
136+
print(plugins);
111137
}
112138
};
113139

lib/plugin.js

+47-10
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,11 @@ function Plugin(id, name, ver, desc, deps) {
1515
this.id = id;
1616
this.name = name;
1717
this.ver = ver || 'default';
18-
this.desc = desc;
18+
this.desc = desc || '';
19+
1920
this.enabled = true;
21+
this.deleted = false;
22+
this.missing = (ver === 'missing');
2023

2124
// only need deps for current platform
2225
this.deps = _.chain(deps || [])
@@ -45,10 +48,32 @@ Plugin.prototype.enable = function(enabled) {
4548
const newfile = enabled ? this.file.substr(1) : '.' + this.file;
4649
try {
4750
fs.renameSync(h.getPluginFile(this.file), h.getPluginFile(newfile));
48-
this.setFile(newfile);
4951
} catch(e) {
50-
log.error(e);
52+
log.error(e.message);
53+
}
54+
this.setFile(newfile);
55+
};
56+
57+
Plugin.prototype.delete = function() {
58+
if (!this.missing) {
59+
try {
60+
const fullpath = h.getPluginFile(this.file);
61+
fs.unlinkSync(fullpath);
62+
} catch(e) {
63+
return log.error(e.message);
64+
}
5165
}
66+
this.deleted = true;
67+
};
68+
69+
Plugin.prototype.save = function() {
70+
const data = cache.get(h.KEYS.plugins) || {};
71+
72+
if (this.deleted) delete data[this.name];
73+
else if (this.missing) return;
74+
else data[this.name] = this.enabled;
75+
76+
cache.set(h.KEYS.plugins, data);
5277
};
5378

5479
Plugin.prototype.install = function(cb) {
@@ -68,6 +93,10 @@ Plugin.prototype.help = function() {};
6893
Plugin.plugins = [];
6994

7095
Plugin.init = function(head) {
96+
log.debug('initializing all plugins');
97+
head = head || require('./core');
98+
99+
// 1. check installed plugins
71100
let plugins = [];
72101
for (let f of h.getCodeDirData('lib/plugins')) {
73102
const p = f.data;
@@ -95,8 +124,20 @@ Plugin.init = function(head) {
95124
last.setNext(p);
96125
last = p;
97126
}
98-
Plugin.plugins = plugins;
99-
return true;
127+
128+
// 2. check saved plugins
129+
const missings = [];
130+
const data = cache.get(h.KEYS.plugins) || {};
131+
for (let k of _.keys(data)) {
132+
if (plugins.find(x => x.name === k)) continue;
133+
const p = new Plugin(-1, k, 'missing');
134+
p.enabled = data[k];
135+
missings.push(p);
136+
}
137+
log.debug('missing plugins: ' + missings.length);
138+
139+
Plugin.plugins = plugins.concat(missings);
140+
return missings.length === 0;
100141
};
101142

102143
Plugin.copy = function(src, cb) {
@@ -141,11 +182,7 @@ Plugin.install = function(name, cb) {
141182
};
142183

143184
Plugin.save = function() {
144-
const data = Plugin.plugins
145-
.map(x => {
146-
return {name: x.name, enabled: x.enabled}
147-
});
148-
cache.set(h.KEYS.plugins, data);
185+
for (let p of this.plugins) p.save();
149186
};
150187

151188
module.exports = Plugin;

0 commit comments

Comments
 (0)