-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathindex.js
More file actions
117 lines (94 loc) · 2.62 KB
/
Copy pathindex.js
File metadata and controls
117 lines (94 loc) · 2.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#! /usr/bin/env node
var cp = require('child_process');
var fs = require('fs');
var md5 = require('blueimp-md5');
var progress = require('cli-progress');
var findCacheDir = require('find-cache-dir');
function median(arr) {
arr = arr.slice(0);
var middle = (arr.length + 1) / 2,
sorted = arr.sort(function(a,b) { return a - b });
return (sorted.length % 2) ? sorted[middle - 1] : (sorted[middle - 1.5] + sorted[middle - 0.5]) / 2;
};
var bar = new progress.Bar({
format: 'progress [{bar}] {percentage}%',
clearOnComplete: true
}, progress.Presets.shades_classic);
var cacheThunk = findCacheDir({ name: 'script-progress', create: true, thunk: true });
var args = process.argv.slice(2);
var cmd = args.shift();
if (!process.stdout.isTTY) {
var res = cp.spawnSync(cmd, args, { env: process.env, stdio: [process.stdin, process.stdout, process.stderr] });
process.exit(res.status);
}
var cacheFileName = md5(args.join(' '));
var DEFAULT_CACHE = { intervals: [] };
var cacheFileContent = fs.readFileSync(cacheThunk(cacheFileName), { flag: 'a+' });
var cache;
try {
cache = JSON.parse(cacheFileContent.toString() || JSON.stringify(DEFAULT_CACHE));
} catch (e) {}
if (!cache || !Array.isArray(cache.intervals)) {
cache = DEFAULT_CACHE;
}
var med = median(cache.intervals);
var eta = med ? Math.max.apply(Math, cache.intervals.filter(function(val) {
return val / med < 1.5;
})) : 0;
var refreshInterval;
if (eta) {
bar.start(eta, 0);
refreshInterval = setInterval(function() {
bar.update(getDiff());
}, 200);
}
var time = process.hrtime();
process.env.FORCE_COLOR = true;
var ls = cp.spawn(cmd, args, { env: process.env });
function getDiff() {
var diff = process.hrtime(time);
return (diff[0] + diff[1] / 10E9);
}
function clear() {
bar.terminal.cursorTo(0, null);
bar.terminal.clearRight();
}
function redraw() {
bar.value = getDiff();
bar.lastDrawnString = '';
bar.render();
}
ls.stdout.on('data', function (data) {
if (eta) {
clear();
bar.terminal.cursorSave();
}
process.stdout.write(data.toString());
if (eta) redraw();
});
ls.stderr.on('data', function (data) {
if (eta) {
clear();
bar.terminal.cursorSave();
}
process.stderr.write(data.toString());
if (eta) redraw();
});
ls.on('close', (code) => {
var diff = getDiff();
if (code) {
process.exit(code);
}
if (!eta || diff / eta > 0.1) {
cache.intervals.push(diff);
if (cache.intervals.length > 5) {
cache.intervals.shift();
}
}
fs.writeFileSync(cacheThunk(cacheFileName), JSON.stringify(cache));
clearInterval(refreshInterval);
if (eta) {
bar.terminal.cursorSave();
bar.stop();
}
});