UNPKG

mecano

Version:

Common functions for system deployment.

189 lines (179 loc) 6.37 kB
// 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); }); }); };