forked from Orbs/jspm-git
-
Notifications
You must be signed in to change notification settings - Fork 0
/
exec-git.js
85 lines (77 loc) · 2.36 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
78
79
80
81
82
83
84
85
/*
* Copyright 2014-2015 Guy Bedford (http://guybedford.com)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var Promise = require('rsvp').Promise;
var execFile = require('child_process').execFile;
var os = require('os');
function Pool(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(function() {
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(function(resolve) {
pool.queue.push(function() {
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, callback) {
return gitPool.execute(function() {
return new Promise(function(resolve){
execFile('git', command, execOpt, function(err, stdout, stderr){
callback(err, stdout, stderr);
resolve();
});
});
});
};
} else {
module.exports = function(command, execOpt, callback) {
execFile('git', command, execOpt, callback);
};
}