forked from flanchan/doushio
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
2.4 KiB
95 lines
2.4 KiB
var child_process = require('child_process'),
|
|
fs = require('fs'),
|
|
util = require('util'),
|
|
winston = require('winston');
|
|
|
|
/* Non-wizard-friendly error message */
|
|
function Muggle(message, reason) {
|
|
if (!(this instanceof Muggle))
|
|
return new Muggle(message, reason);
|
|
Error.call(this, message);
|
|
Error.captureStackTrace(this, this.constructor);
|
|
this.message = message;
|
|
this.reason = reason;
|
|
}
|
|
util.inherits(Muggle, Error);
|
|
exports.Muggle = Muggle;
|
|
|
|
Muggle.prototype.most_precise_error_message = function () {
|
|
var deepest = this.message;
|
|
var muggle = this;
|
|
var sanity = 10;
|
|
while (muggle.reason && muggle.reason instanceof Muggle) {
|
|
muggle = muggle.reason;
|
|
if (muggle.message && typeof muggle.message == 'string')
|
|
deepest = muggle.message;
|
|
if (--sanity <= 0)
|
|
break;
|
|
}
|
|
return deepest;
|
|
};
|
|
|
|
Muggle.prototype.deepest_reason = function () {
|
|
if (this.reason && this.reason instanceof Muggle)
|
|
return this.reason.deepest_reason();
|
|
return this;
|
|
};
|
|
|
|
exports.move = function (src, dest, callback) {
|
|
child_process.execFile('/bin/mv', ['--', src, dest],
|
|
function (err, stdout, stderr) {
|
|
if (err)
|
|
callback(Muggle("Couldn't move file into place.",
|
|
stderr || err));
|
|
else
|
|
callback(null);
|
|
});
|
|
};
|
|
|
|
exports.movex = function (src, dest, callback) {
|
|
child_process.execFile('/bin/mv', ['-n', '--', src, dest],
|
|
function (err, stdout, stderr) {
|
|
if (err)
|
|
callback(Muggle("Couldn't move file into place.",
|
|
stderr || err));
|
|
else
|
|
callback(null);
|
|
});
|
|
};
|
|
|
|
exports.cpx = function (src, dest, callback) {
|
|
// try to do a graceful (non-overwriting) copy
|
|
child_process.execFile('/bin/cp', ['-n', '--', src, dest],
|
|
function (err, stdout, stderr) {
|
|
if (err) {
|
|
winston.warn('overwriting (' + src + ') to (' + dest + ').');
|
|
// just overwrite
|
|
child_process.execFile('/bin/cp', ['--', src, dest], function (err, o, e) {
|
|
if (err)
|
|
callback(Muggle("Couldn't copy file into place.",
|
|
e || err));
|
|
else
|
|
callback(null);
|
|
});
|
|
|
|
}
|
|
else
|
|
callback(null);
|
|
});
|
|
};
|
|
|
|
exports.checked_mkdir = function (dir, cb) {
|
|
fs.mkdir(dir, function (err) {
|
|
cb(err && err.code == 'EEXIST' ? null : err);
|
|
});
|
|
};
|
|
|
|
// TEMP duplicated from common.js for imager daemon sanity
|
|
exports.random_id = function () {
|
|
return Math.floor(Math.random() * 1e16) + 1;
|
|
};
|
|
|
|
exports.json_paranoid = function (obj) {
|
|
return JSON.stringify(obj).replace(/\//g, '\\x2f');
|
|
};
|