UNPKG

mecano

Version:

Common functions for system deployment.

189 lines (181 loc) 5.79 kB
// Generated by CoffeeScript 1.11.1 var each, fs, misc, path, uid_gid, wrap; module.exports = function(options, callback) { var modified; options.log({ message: "Entering mkdir", level: 'DEBUG', module: 'mecano/lib/mkdir' }); modified = false; if (options.argument != null) { options.target = options.argument; } if (options.directory == null) { options.directory = options.target; } if (options.directory == null) { options.directory = options.source; } if (options.directory == null) { return callback(new Error('Missing directory option')); } if (!options.ssh && (options.cwd === true || !options.cwd)) { options.cwd = process.cwd(); } if (!Array.isArray(options.directory)) { options.directory = [options.directory]; } if (options.parent === true) { options.parent = {}; } return each(options.directory).call((function(_this) { return function(directory, callback) { var do_create, do_create_parent, do_stats, do_update; do_stats = function() { var directories, dirs, end, i, p; end = false; dirs = []; p = options.ssh ? path.posix : path; directory = options.cwd ? p.resolve(options.cwd, directory) : p.normalize(directory); directories = directory.split('/'); directories.shift(); if (directories[directories.length - 1] === '') { directories.pop(); } directories = (function() { var j, ref, results; results = []; for (i = j = 0, ref = directories.length; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) { results.push('/' + directories.slice(0, directories.length - i).join('/')); } return results; })(); return each(directories).call(function(directory, i, next) { if (end) { return next(); } options.log({ message: "Stat '" + directory + "'", level: 'DEBUG', module: 'mecano/lib/mkdir' }); 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(callback); }; 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()).call(function(directory, i, callback) { var attr, attrs, j, len, opts, ref, val; if ((options.exclude != null) && options.exclude instanceof RegExp) { if (options.exclude.test(path.basename(directory))) { return callback(); } } options.log({ message: "Create directory \"" + directory + "\"", level: 'DEBUG', module: 'mecano/lib/mkdir' }); 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] : (ref = options.parent) != null ? ref[attr] : void 0; if (val != null) { opts[attr] = val; } } return fs.mkdir(options.ssh, directory, opts, function(err) { if (err) { return callback(err); } options.log({ message: "Directory \"" + directory + "\" created ", level: 'INFO', module: 'mecano/lib/mkdir' }); modified = true; return callback(); }, 1000); }).then(function(err) { if (err) { return callback(err); } return callback(); }); }; do_update = function(stat) { options.log({ message: "Directory already exists", level: 'INFO', module: 'mecano/lib/mkdir' }); _this.chown({ target: directory, stat: stat, uid: options.uid, gid: options.gid, "if": (options.uid != null) || (options.gid != null) }); _this.chmod({ target: directory, stat: stat, mode: options.mode, "if": options.mode != null }); return _this.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');