in 'copyDirRecursive':

- replaces 'forceDelete' with 'preserve'.
- added an option to get 'excludeHiddenUnix'
= added an option to get 'inflateSymlinks'
This commit is contained in:
refaelos 2013-05-20 19:38:17 +03:00
parent 58380677c2
commit 02bd67c8a6

View file

@ -317,6 +317,78 @@ exports.rmdirRecursive = function rmdirRecursive(dir, failSilent, clbk){
});
};
exports.copyDirRecursive = function copyDirRecursive(srcDir, newDir, opts, clbk) {
if (typeof opts === 'function')
clbk = opts;
var copyDirRecInner = function() {
fs.stat(srcDir, function (err1, srcDirStat) {
if (err1) return clbk(err1);
fs.readdir(srcDir, function (err, files) {
if (err) return clbk(err);
(function copyFiles(err) {
if (err) return clbk(err);
var filename = files.shift();
if (filename === null || typeof filename == 'undefined') {
return clbk();
}
if (opts.excludeHiddenUnix && /^\./.test(filename))
return clbk();
var file = srcDir + '/' + filename,
newFile = newDir + '/' + filename;
fs.stat(file, function (err, fileStat) {
if (fileStat.isDirectory())
copyDirRecursive(file, newFile, opts, copyFiles);
else if (fileStat.isSymbolicLink()) {
fs.readlink(file, function (err, link) {
if (!opts.inflateSymlinks) {
fs.symlink(link, newFile, copyFiles);
} else {
fs.lstat(srcDir + '/' + link, function (err, stats) {
if (stats.isDirectory()) {
copyDirRecursive(srcDir + '/' + link, newFile, opts, copyFiles);
} else {
fs.readFile(srcDir + '/' + link, function (err, data) {
fs.writeFile(newFile, data, copyFiles);
});
}
});
}
});
}
else
fs.readFile(file, function (err, data) {
fs.writeFile(newFile, data, copyFiles);
});
});
})();
});
});
};
fs.stat(newDir, function(err, newDirStat){
if (!err) {
if ((typeof opts !== 'undefined' && typeof opts !== 'function' && !opts.preserve) && (newDirStat.isDirectory())) {
return exports.rmdirRecursive(newDir, function(err){
copyDirRecursive(srcDir, newDir, opts, clbk);
});
} else {
copyDirRecInner();
}
} else {
fs.mkdir(newDir, srcDirStat.mode, function(err){
if (err) return clbk(err);
copyDirRecInner();
});
}
});
};
/* wrench.copyDirRecursive("directory_to_copy", "new_location", {forceDelete: bool}, callback);
*
* Recursively dives through a directory and moves all its files to a new