mecano
Version:
Common functions for system deployment.
186 lines (177 loc) • 6.09 kB
JavaScript
// 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;
};