UNPKG

mecano

Version:

Common functions for system deployment.

175 lines (167 loc) 5.48 kB
// Generated by CoffeeScript 1.9.1 var each, fs, misc, path, uid_gid, wrap; module.exports = function(options, callback) { var cwd, modified, ref; modified = false; if (options.argument != null) { options.destination = options.argument; } if (options.directory == null) { options.directory = options.destination; } if (options.directory == null) { options.directory = options.source; } if (options.directory == null) { return callback(new Error('Missing directory option')); } cwd = (ref = options.cwd) != null ? ref : process.cwd(); if (!Array.isArray(options.directory)) { options.directory = [options.directory]; } if (options.parent === true) { options.parent = {}; } return each(options.directory).run((function(_this) { return function(directory, callback) { var do_create, do_create_parent, do_stats, do_update; if (typeof options.log === "function") { options.log("Mecano `mkdir`: " + directory); } do_stats = function() { var directories, dirs, end, i; end = false; dirs = []; directory = path.resolve(cwd, directory); directories = directory.split('/'); directories.shift(); directories = (function() { var j, ref1, results; results = []; for (i = j = 0, ref1 = directories.length; 0 <= ref1 ? j < ref1 : j > ref1; i = 0 <= ref1 ? ++j : --j) { results.push('/' + directories.slice(0, directories.length - i).join('/')); } return results; })(); return each(directories).run(function(directory, i, next) { if (end) { return next(); } 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_parent(dirs); } else { return next(); } } if (stat != null ? stat.isDirectory() : void 0) { end = true; if (i === 0) { return do_update(stat); } else { return do_create_parent(dirs); } } if (err) { return next(err); } else { return next(new Error("Not a directory: " + (JSON.stringify(directory)))); } }); }).then(function(err) { if (err) { return callback(err); } }); }; do_create_parent = function(directories) { if (!(options.uid || options.guid)) { return do_create(directories); } return uid_gid(options, function(err) { if (err) { return next(err); } return do_create(directories); }); }; do_create = function(directories) { return each(directories.reverse()).run(function(directory, i, callback) { var attr, attrs, j, len, opts, ref1, val; if ((options.exclude != null) && options.exclude instanceof RegExp) { if (options.exclude.test(path.basename(directory))) { return callback(); } } if (directory !== options.directory) { if (typeof options.log === "function") { options.log("Mecano `mkdir`: " + (JSON.stringify(directory)) + " created"); } } attrs = ['mode', 'uid', 'gid', 'size', 'atime', 'mtime']; opts = {}; for (j = 0, len = attrs.length; j < len; j++) { attr = attrs[j]; val = i === directories.length - 1 ? options[attr] : (ref1 = options.parent) != null ? ref1[attr] : void 0; if (val != null) { opts[attr] = val; } } return fs.mkdir(options.ssh, directory, opts, function(err) { if (err) { return callback(err); } modified = true; return callback(); }, 1000); }).then(function(err) { if (err) { return callback(err); } return callback(); }); }; do_update = function(stat) { if (typeof options.log === "function") { options.log("Mecano `mkdir`: " + (JSON.stringify(directory)) + " exists"); } return _this.chown({ ssh: options.ssh, destination: directory, stat: stat, uid: options.uid, gid: options.gid, log: options.log, "if": (options.uid != null) || (options.gid != null) }).chmod({ ssh: options.ssh, destination: directory, stat: stat, mode: options.mode, log: options.log, "if": options.mode != null }).then(function(err, moded) { if (err) { return callback(err); } if (moded) { modified = true; } return callback(); }); }; return do_stats(); }; })(this)).then(function(err) { return callback(err, modified); }); }; fs = require('ssh2-fs'); path = require('path'); each = require('each'); misc = require('./misc'); wrap = require('./misc/wrap'); uid_gid = require('./misc/uid_gid');