diff --git a/lib/wrench.js b/lib/wrench.js index 3ebe564..519568a 100644 --- a/lib/wrench.js +++ b/lib/wrench.js @@ -111,3 +111,84 @@ exports.chmodSyncRecursive = function(sourceDir, filemode) { /* Finally, chmod the parent directory */ fs.chmod(sourceDir, filemode); }; + + + +/* wrench.rmdirRecursive("directory_path", callback); + * + * Recursively dives through directories and obliterates everything about it. + */ +exports.rmdirRecursive = function rmdirRecursive(dir, clbk){ + fs.readdir(dir, function(err, files){ + if (err) return clbk(); + var called = 0; + var done = function(){ + if (called == files.length) + fs.rmdir(dir, clbk); + else + called++; + }; + done(); + files.forEach(function(f){ + f = dir+f; + fs.stat(f, function(err, stat){ + if (err) return done(); + if (stat.isDirectory()) + rmdirRecursive(f, done); + else + fs.unlink(f, done); + }); + }); + }); +}; + +/* wrench.copyDirRecursive("directory_to_copy", "new_location", callback); + * + * Recursively dives through a directory and moves all its files to a new + * location. + * + * Note: Directories should be passed to this function without a trailing slash. + */ +exports.copyDirRecursive = function copyDirRecursive(srcDir, newDir, clbk) { + fs.stat(newDir, function(err, newDirStat){ + if (!err) return exports.rmdirRecursive(newDir, function(){ + copyDirRecursive(srcDir, newDir, clbk); + }); + + fs.stat(srcDir, function(err, srcDirStat){ + if (err) return clbk(err); + fs.mkdir(newDir, srcDirStat.mode, function(err){ + if (err) return clbk(err); + fs.readdir(srcDir, function(err, files){ + if (err) return clbk(err); + var called = 0; + var done = function(err){ + if (err) return clbk(err); + if (called == files.length) + clbk(); + else + called++; + }; + done(); + files.forEach(function(filename){ + var file = srcDir+'/'+filename, + newFile = newDir+'/'+filename, + called = 0; + fs.stat(file, function(err, fileStat){ + if (fileStat.isDirectory()) + copyDirRecursive(file, newFile, done); + else if (fileStat.isSymbolicLink()) + fs.readlink(file, function(err, link){ + fs.symlink(link, newFile, done); + }); + else + fs.readFile(file, function(err, data){ + fs.writeFile(newFile, data, done); + }); + }); + }); + }); + }); + }); + }); +};