c9-core/plugins/c9.ide.installer/cli.js

147 wiersze
4.7 KiB
JavaScript

define(function(require, exports, module) {
main.consumes = [
"Plugin", "installer"
];
main.provides = ["installer.cli"];
return main;
/*
- Always assume one session
- Start immediately
*/
function main(options, imports, register) {
var Plugin = imports.Plugin;
var installer = imports.installer;
var RED = "\x1b[01;31m";
var GREEN = "\x1b[01;32m";
var YELLOW = "\x1b[01;33m";
var BLUE = "\x1b[01;34m";
var MAGENTA = "\x1b[01;35m";
var LIGHTBlUE = "\x1b[01;94m";
var RESETCOLOR = "\x1b[0m";
var BOLD = "\x1b[01;1m";
var UNBOLD = "\x1b[01;21m";
var verbose = true;
/***** Initialization *****/
var plugin = new Plugin("Ajax.org", main.consumes);
// var emit = plugin.getEmitter();
function load() {
installer.$setPtyExec(function(options, callback) {
var cwd = options.cwd;
if (cwd && cwd.charAt(0) == "~")
cwd = process.env.HOME + "/" + cwd.substr(1);
var childProcess = require("child_process");
var p = childProcess.spawn("bash", [
"-c", options.code
].concat(options.args || []), {
stdio: [
process.stdin,
verbose ? process.stdout : "ignore",
verbose ? process.stderr : "ignore"
],
cwd: cwd
});
p.on("close", function(code) {
if (!code) callback();
else callback(new Error("Failed " + options.name + ". Exit code " + code));
});
});
// Hook the creation of new sessions
installer.on("beforeStart", function(e) {
start(e.session);
}, plugin);
}
/***** Methods *****/
function start(session, callback) {
// Start Installation
if (verbose) {
logln("Installation Started", LIGHTBlUE);
logln("");
}
else {
log("Installing Dependencies...", LIGHTBlUE);
}
session.on("run", function() {
if (!verbose) return;
var heading = "Package " + session.package.name
+ " " + (session.package.version || "");
logln(heading + "\n" + Array(heading.length + 1).join("-"));
});
var lastOptions;
session.on("each", function(e) {
if (!verbose) return;
if (lastOptions != e.options) {
lastOptions = e.options;
if (e.options.name) {
logln("Installing " + e.options.name, BLUE);
logln("");
}
}
});
session.on("data", function(e) {
if (!verbose) return;
log(e.data);
});
session.start(function(err) {
if (err) {
logln("\n" + err.message + "\n\n" + RED
+ "One or more errors occured. "
+ "Please try to resolve them and "
+ "try again or contact support@c9.io. "
+ (!verbose ? "Use --verbose to see more output." : "")
+ RESETCOLOR);
}
else if (verbose) {
logln("");
logln("Installation Completed.", LIGHTBlUE);
}
else {
logln(" [Done]", LIGHTBlUE);
}
}, true);
}
function log(msg, color, unset) {
logln(msg, color, unset, true);
}
function logln(msg, color, unset, noLineEnd) {
process.stdout.write((color || "") + msg + (color ? unset || RESETCOLOR : "") + (noLineEnd ? "" : "\n"));
}
/***** Lifecycle *****/
plugin.on("load", function() {
load();
});
plugin.on("unload", function() {
verbose = true;
});
/***** Register and define API *****/
plugin.freezePublicAPI({
get verbose() { return verbose; },
set verbose(v) { verbose = v; }
});
register(null, {
"installer.cli": plugin
});
}
});