diff --git a/lib/wrench.js b/lib/wrench.js index cc27397..1066ee7 100644 --- a/lib/wrench.js +++ b/lib/wrench.js @@ -12,7 +12,8 @@ */ var fs = require("fs"), - _path = require("path"); + _path = require("path"), + mkdirp = require("mkdirp"); /* wrench.readdirSyncRecursive("directory_path"); @@ -166,7 +167,7 @@ exports.rmdirSyncRecursive = function(path, failSilent) { */ exports.copyDirSyncRecursive = function(sourceDir, newDirLocation, opts) { try { - if(fs.statSync(newDirLocation).isDirectory()) { + if(fs.statSync(newDirLocation).isDirectory()) { if(typeof opts !== 'undefined' && opts.forceDelete) { exports.rmdirSyncRecursive(newDirLocation); } else { @@ -292,7 +293,7 @@ exports.chownSyncRecursive = function(sourceDir, uid, gid) { */ exports.rmdirRecursive = function rmdirRecursive(dir, failSilent, clbk){ fs.readdir(dir, function(err, files){ - if(err && typeof failSilent === 'boolean' && !failSilent) + if(err && typeof failSilent === 'boolean' && !failSilent) return clbk(err); if(typeof failSilent === 'function') @@ -328,53 +329,63 @@ exports.copyDirRecursive = function copyDirRecursive(srcDir, newDir, opts, clbk) if (typeof opts === 'function') clbk = opts; + srcDir = _path.normalize(srcDir); + newDir = _path.normalize(newDir); + + var handleFile = function(file, newFile, clbk) { + fs.readFile(file, function (err, data) { + fs.writeFile(newFile, data, clbk); + }); + }; + + var handleSymlink = function(file, newFile, clbk) { + fs.readlink(file, function (err, link) { + if (!opts.inflateSymlinks) { + fs.symlink(link, newFile, clbk); + } else { + fs.lstat(srcDir + '/' + link, function (err, stats) { + if (stats.isDirectory()) { + copyDirRecursive(srcDir + '/' + link, newFile, opts, clbk); + } else { + handleFile(srcDir + '/' + link, newFile, clbk); + } + }); + } + }); + }; var copyDirRecInner = function() { - fs.stat(srcDir, function (err1, srcDirStat) { - if (err1) return clbk(err1); - fs.readdir(srcDir, function (err, files) { + fs.readdir(srcDir, function (err, files) { + if (err) return clbk(err); + (function copyFiles(err) { 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(); + var filename = files.shift(); + + while (filename && opts.excludeHiddenUnix && /^\./.test(filename)) { + filename = files.shift(); + } + + if (filename === null || typeof filename == 'undefined') { + 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()) { + handleSymlink(file, newFile, copyFiles); + } + else { + handleFile(file, newFile, copyFiles); } - 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); - }); - }); - })(); - }); + }); + })(); }); }; @@ -388,9 +399,14 @@ exports.copyDirRecursive = function copyDirRecursive(srcDir, newDir, opts, clbk) copyDirRecInner(); } } else { - fs.mkdir(newDir, srcDirStat.mode, function(err){ - if (err) return clbk(err); - copyDirRecInner(); + fs.stat(srcDir, function (err, srcDirStat) { + if (err) { + clbk(new Error('The source directory (probably) doesn\'t exist. error: ' + err)); + } + mkdirp(newDir, srcDirStat.mode, function(err){ + if (err) return clbk(err); + copyDirRecInner(); + }); }); } });