dojo-util
Version:
Dojo utilities including build system for optimizing JavaScript application performance, and DOH testing tool
61 lines (55 loc) • 1.65 kB
JavaScript
define(["../fileHandleThrottle", "../messages"], function(fht, messages){
var match = process.version.match(/(\d+)\.(\d+)\.(\d+)/),
versionMajor = Number(match[1]),
versionMinor = Number(match[2]),
versionPatch = Number(match[3]),
spawn = require.nodeRequire("child_process").spawn;
return {
cwd:process.cwd,
exit:function(code){
// no more messages
messages.stop();
process.exit(code);
},
exec:function() {
// signature is (command, arg1, ..., argn, errorMessage, bc, callback)
for(var command = arguments[0], args = [], i = 1; i<arguments.length-3; i++){
args.push(arguments[i]);
}
var
errorMessage = arguments[i++],
bc = arguments[i++],
callback = arguments[i];
fht.enqueue(function(){
var
text = "",
process = spawn(command, args),
status = 0,
finish = function(code){
// release when both exit and close events occur; see below
if(++status===2){
fht.release();
if(code){
bc.log("execFailed", ["message", errorMessage, "output", text]);
}
callback && callback(code, text);
}
};
process.on("exit", finish);
// for node>=0.8, close is called; for node <0.8 close appears to not be called (verified for 0.6)
// in 0.8+ releasing the file handle before close is called can use up file handles too fast (see #15620)
if(versionMajor==0 && versionMinor<=7){
++status;
}else{
process.on("close", finish);
}
process.stdout.on("data", function(data){
text+= data;
});
process.stderr.on("data", function(data){
text+= data;
});
});
}
};
});