mecano
Version:
Common functions for system deployment.
189 lines (181 loc) • 5.79 kB
JavaScript
// 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');