diff --git a/lib/wrench.js b/lib/wrench.js index 75125b7..b63a455 100644 --- a/lib/wrench.js +++ b/lib/wrench.js @@ -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