Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 22d1786

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

File tree

3 files changed

+93
-32
lines changed

3 files changed

+93
-32
lines changed

‎lib/cli.js‎

Lines changed: 1 addition & 3 deletions
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‎

Lines changed: 45 additions & 19 deletions
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‎

Lines changed: 47 additions & 10 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /