This repository has been archived by the owner on Feb 18, 2024. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 43
/
exec-git.js
77 lines (72 loc) · 1.91 KB
/
exec-git.js
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
const exec = require('child_process').exec;
const os = require('os');
class Pool {
constructor (count) {
this.count = count;
this.queue = [];
this.promises = new Array(count);
}
}
/* Run the function immediately. */
function run (pool, idx, executionFunction) {
var p = Promise.resolve()
.then(executionFunction)
.then(() => {
delete pool.promises[idx];
var next = pool.queue.pop();
if (next)
pool.execute(next);
});
pool.promises[idx] = p;
return p;
}
/* Defer function to run once all running and queued functions have run. */
function enqueue (pool, executeFunction) {
return new Promise(resolve => {
pool.queue.push(() => {
return Promise.resolve()
.then(executeFunction)
.then(resolve);
});
});
}
/* Take a function to execute within pool, and return promise delivering the functions
* result immediately once it is run. */
Pool.prototype.execute = function (executionFunction) {
var idx = -1;
for (var i = 0; i < this.count; i++)
if (!this.promises[i])
idx = i;
if (idx !== -1)
return run(this, idx, executionFunction);
else
return enqueue(this, executionFunction);
};
if (process.platform === 'win32') {
var gitPool = new Pool(Math.min(os.cpus().length, 2));
module.exports = function (command, execOpt) {
return new Promise((topResolve, topReject) => {
return gitPool.execute(function() {
return new Promise(resolve => {
exec('git ' + command, execOpt, (err, stdout, stderr) => {
if (err)
topReject(stderr || err);
else
topResolve(stdout);
resolve();
});
});
});
});
};
}
else {
module.exports = (command, execOpt) => new Promise((resolve, reject) => {
exec('git ' + command, execOpt, (err, stdout, stderr) => {
if (err)
reject(stderr || err);
else
resolve(stdout);
});
});
}