UNPKG

mecano

Version:

Common functions for system deployment.

158 lines (151 loc) 4.97 kB
// Generated by CoffeeScript 1.9.1 var each, fs, glob, misc, path; module.exports = function(options, callback) { var do_copy, do_directory, dstStat, modified, srcStat; if (!options.source) { return callback(new Error('Missing source')); } if (!options.destination) { return callback(new Error('Missing destination')); } modified = false; srcStat = null; dstStat = null; if (typeof options.log === "function") { options.log("Mecano `copy`: stat source file"); } fs.stat(options.ssh, options.source, function(err, stat) { if (err) { return callback(err); } srcStat = stat; if (typeof options.log === "function") { options.log("Mecano `copy`: stat destination file"); } return fs.stat(options.ssh, options.destination, function(err, stat) { var sourceEndWithSlash; if (err && err.code !== 'ENOENT') { return callback(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, function(err) { return callback(err, modified); }); } else { return do_copy(options.source, function(err) { return callback(err, modified); }); } }); }); do_directory = function(dir, callback) { if (typeof options.log === "function") { options.log("Source is a directory"); } return glob(options.ssh, dir + "/**", { dot: true }, function(err, files) { if (err) { return callback(err); } return each(files).run(function(file, callback) { return do_copy(file, callback); }).then(callback); }); }; return do_copy = (function(_this) { return function(source, callback) { var destination, do_chown_chmod, 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 (typeof options.log === "function") { options.log("Mecano `copy`: 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_chmod(destination); } if (typeof options.log === "function") { options.log("Mecano `copy`: 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_chmod(destination); }); }); }; do_chown_chmod = function(destination) { return _this.chown({ destination: destination, uid: options.uid, gid: options.gid, "if": (options.uid != null) || (options.gid != null) }).chmod({ destination: destination, mode: options.mode, "if": options.mode != null }).then(function(err, status) { if (err) { return callback(err); } if (status) { modified = true; } return do_end(); }); }; return do_end = function() { if (modified) { if (typeof options.log === "function") { options.log("Mecano `copy`: copy file " + source); } } return callback(null, modified); }; }; })(this); }; fs = require('ssh2-fs'); path = require('path'); each = require('each'); misc = require('./misc'); glob = require('./misc/glob');