mecano
Version:
Common functions for system deployment.
98 lines (90 loc) • 2.71 kB
JavaScript
// Generated by CoffeeScript 1.7.1
var child, conditions, each, fs, misc, write;
fs = require('ssh2-fs');
each = require('each');
misc = require('./misc');
conditions = require('./misc/conditions');
child = require('./misc/child');
write = require('./write');
module.exports = function(goptions, options, callback) {
var clean, finish, result, _ref;
_ref = misc.args(arguments), goptions = _ref[0], options = _ref[1], callback = _ref[2];
clean = function(content, undefinedOnly) {
var k, v;
for (k in content) {
v = content[k];
if (v && typeof v === 'object') {
content[k] = clean(v, undefinedOnly);
continue;
}
if (typeof v === 'undefined') {
delete content[k];
}
if (!undefinedOnly && v === null) {
delete content[k];
}
}
return content;
};
result = child();
finish = function(err, written) {
if (callback) {
callback(err, written);
}
return result.end(err, written);
};
misc.options(options, function(err, options) {
var written;
if (err) {
return finish(err);
}
written = 0;
return each(options).parallel(goptions.parallel).on('item', function(options, next) {
var content, destination, do_get, do_write, merge, ssh;
merge = options.merge, destination = options.destination, content = options.content, ssh = options.ssh;
if (!content) {
return next(new Error('Missing content'));
}
if (!destination) {
return next(new Error('Missing destination'));
}
do_get = function() {
if (!merge) {
return do_write();
}
return fs.exists(ssh, destination, function(err, exists) {
if (err) {
return next(err);
}
if (!exists) {
return do_write();
}
return fs.readFile(ssh, destination, 'ascii', function(err, c) {
var parse;
if (err && err.code !== 'ENOENT') {
return next(err);
}
content = clean(content, true);
parse = options.parse || misc.ini.parse;
content = misc.merge(parse(c, options), content);
return do_write();
});
});
};
do_write = function() {
var stringify;
clean(content);
stringify = options.stringify || misc.ini.stringify;
options.content = stringify(content, options);
return write(options, function(err, w) {
written += w;
return next(err);
});
};
return do_get();
}).on('both', function(err) {
return finish(err, written);
});
});
return result;
};