mecano
Version:
Common functions for system deployment.
189 lines (179 loc) • 6.37 kB
JavaScript
// Generated by CoffeeScript 1.7.1
var child, chmod, chown, conditions, each, fs, misc, path;
fs = require('ssh2-fs');
path = require('path');
each = require('each');
misc = require('./misc');
conditions = require('./misc/conditions');
child = require('./misc/child');
chmod = require('./chmod');
chown = require('./chown');
module.exports = function(goptions, options, callback) {
var _ref;
_ref = misc.args(arguments), goptions = _ref[0], options = _ref[1], callback = _ref[2];
return misc.options(options, function(err, options) {
var copied;
if (err) {
return callback(err);
}
copied = 0;
return each(options).parallel(goptions.parallel).on('item', function(options, next) {
if (!options.source) {
return next(new Error('Missing source'));
}
if (!options.destination) {
return next(new Error('Missing destination'));
}
if (options.not_if_exists === true) {
options.not_if_exists = options.destination;
}
return conditions.all(options, next, function() {
var do_copy, do_directory, dstStat, modified, srcStat;
modified = false;
srcStat = null;
dstStat = null;
if (typeof options.log === "function") {
options.log("Stat source file");
}
fs.stat(options.ssh, options.source, function(err, stat) {
if (err) {
return next(err);
}
srcStat = stat;
if (typeof options.log === "function") {
options.log("Stat destination file");
}
return fs.stat(options.ssh, options.destination, function(err, stat) {
var sourceEndWithSlash;
if (err && err.code !== 'ENOENT') {
return next(err);
}
dstStat = stat;
sourceEndWithSlash = options.source.lastIndexOf('/') === options.source.length - 1;
if (srcStat.isDirectory() && dstStat && !sourceEndWithSlash) {
options.destination = path.resolve(options.destination, path.basename(options.source));
}
if (srcStat.isDirectory()) {
return do_directory(options.source, next);
} else {
return do_copy(options.source, next);
}
});
});
do_directory = function(dir, callback) {
if (typeof options.log === "function") {
options.log("Source is a directory");
}
return each().files("" + dir + "/**").on('item', function(file, next) {
return do_copy(file, next);
}).on('both', callback);
};
return do_copy = function(source, callback) {
var destination, do_chmod, do_chown, do_copy_dir, do_copy_file, do_end;
if (srcStat.isDirectory()) {
destination = path.resolve(options.destination, path.relative(options.source, source));
} else if (!srcStat.isDirectory() && (dstStat != null ? dstStat.isDirectory() : void 0)) {
destination = path.resolve(options.destination, path.basename(source));
} else {
destination = options.destination;
}
fs.stat(options.ssh, source, function(err, stat) {
if (err) {
return callback(err);
}
if (stat.isDirectory()) {
return do_copy_dir(source, destination);
} else {
return do_copy_file(source, destination);
}
});
do_copy_dir = function(source, destination) {
if (source === options.source) {
return callback();
}
if (typeof options.log === "function") {
options.log("Create directory " + destination);
}
return fs.mkdir(options.ssh, destination, function(err) {
if ((err != null ? err.code : void 0) === 'EEXIST') {
return callback();
}
if (err) {
return callback(err);
}
modified = true;
return do_end();
});
};
do_copy_file = function(source, destination) {
return misc.file.compare(options.ssh, [source, destination], function(err, md5) {
if (err && err.message.indexOf('Does not exist') !== 0) {
return callback(err);
}
if (md5) {
return do_chown(destination);
}
if (typeof options.log === "function") {
options.log("Copy file from " + source + " into " + destination);
}
return misc.file.copyFile(options.ssh, source, destination, function(err) {
if (err) {
return callback(err);
}
modified = true;
return do_chown(destination);
});
});
};
do_chown = function(destination) {
if (!options.uid && !options.gid) {
return do_chmod();
}
return chown({
ssh: options.ssh,
log: options.log,
destination: destination,
uid: options.uid,
gid: options.gid
}, function(err, chowned) {
if (err) {
return callback(err);
}
if (chowned) {
modified = chowned;
}
return do_chmod();
});
};
do_chmod = function(destination) {
if (!options.mode) {
return do_end();
}
return chmod({
ssh: options.ssh,
log: options.log,
destination: options.destination,
mode: options.mode
}, function(err, chmoded) {
if (err) {
return callback(err);
}
if (chmoded) {
modified = chmoded;
}
return do_end();
});
};
return do_end = function() {
if (modified) {
copied++;
}
return callback();
};
};
});
}).on('both', function(err) {
return callback(err, copied);
});
});
};