UNPKG

mecano

Version:

Common functions for system deployment.

186 lines (177 loc) 6.09 kB
// Generated by CoffeeScript 1.7.1 var child, 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'); chown = require('./chown'); module.exports = function(goptions, options, callback) { var finish, result, _ref; _ref = misc.args(arguments), goptions = _ref[0], options = _ref[1], callback = _ref[2]; result = child(); finish = function(err, created) { if (callback) { callback(err, created); } return result.end(err, created); }; misc.options(options, function(err, options) { var created; if (err) { return finish(err); } created = 0; return each(options).parallel(goptions.parallel).on('item', function(options, next) { var cwd, _ref1; if (typeof options === 'string') { options = { directory: options }; } if (options.directory == null) { options.directory = options.source; } if (options.directory == null) { options.directory = options.destination; } if (options.directory == null) { return next(new Error('Missing directory option')); } cwd = (_ref1 = options.cwd) != null ? _ref1 : process.cwd(); if (!Array.isArray(options.directory)) { options.directory = [options.directory]; } return conditions.all(options, next, function() { var mode; mode = options.mode || 0x1ed; if (typeof options.log === "function") { options.log("Make directory " + options.directory); } return each(options.directory).on('item', function(directory, next) { var do_create, do_stats, do_update; do_stats = function() { var directories, dirs, end, i; end = false; dirs = []; directory = path.resolve(cwd, directory); directories = directory.split('/'); directories.shift(); directories = (function() { var _i, _ref2, _results; _results = []; for (i = _i = 0, _ref2 = directories.length; 0 <= _ref2 ? _i < _ref2 : _i > _ref2; i = 0 <= _ref2 ? ++_i : --_i) { _results.push('/' + directories.slice(0, directories.length - i).join('/')); } return _results; })(); return each(directories).on('item', function(directory, i, next) { if (end) { return next(); } if (typeof options.log === "function") { options.log("Stat directory " + directory); } return fs.stat(options.ssh, directory, function(err, stat) { if ((err != null ? err.code : void 0) === 'ENOENT') { directory.stat = stat; dirs.push(directory); if (i === directories.length - 1) { return do_create(dirs); } else { return next(); } } if (stat != null ? stat.isDirectory() : void 0) { end = true; if (i === 0) { return do_update(stat); } else { return do_create(dirs); } } if (err) { return next(err); } else { return next(new Error('Not a directory: #{JSON.encode(directory)}')); } }); }).on('both', function(err) { if (err) { return next(err); } }); }; do_create = function(directories) { return each(directories.reverse()).on('item', function(directory, next) { if ((options.exclude != null) && options.exclude instanceof RegExp) { if (options.exclude.test(path.basename(directory))) { return next(); } } if (directory !== options.directory) { if (typeof options.log === "function") { options.log("Create directory " + directory); } } return fs.mkdir(options.ssh, directory, options, function(err) { var modified; if (err) { return next(err); } modified = true; return next(); }); }).on('both', function(err) { created++; return next(err); }); }; do_update = function(stat) { var do_chmod, do_chown, do_end, modified; modified = false; do_chown = function() { return chown({ ssh: options.ssh, destination: directory, uid: options.uid, gid: options.gid }, function(err, owned) { if (owned) { modified = true; } return do_chmod(); }); }; do_chmod = function() { if (!mode) { return do_end(); } if (misc.file.cmpmod(stat.mode, mode)) { return do_end(); } return fs.chmod(options.ssh, directory, mode, function(err) { modified = true; return do_end(); }); }; do_end = function() { if (modified) { created++; } return next(); }; return do_chown(); }; return do_stats(); }).on('both', function(err) { return next(err); }); }); }).on('both', function(err) { return finish(err, created); }); }); return result; };