From 04c8fe0239446b7bb162339302b151359f7d2188 Mon Sep 17 00:00:00 2001 From: Ryan McGrath Date: Fri, 3 May 2013 16:48:08 -0400 Subject: [PATCH] Fixes #50. They're right, this should follow OS default behavior. --- lib/wrench.js | 33 +++++++++++++++++++++------------ readme.md | 12 +++++++++++- 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/lib/wrench.js b/lib/wrench.js index 0b9b697..297d28d 100644 --- a/lib/wrench.js +++ b/lib/wrench.js @@ -160,16 +160,20 @@ exports.rmdirSyncRecursive = function(path, failSilent) { * * Recursively dives through a directory and moves all its files to a new location. This is a * Synchronous function, which blocks things until it's done. If you need/want to do this in - * an Asynchronous manner, look at wrench.copyDirRecursively() below. + * an Asynchronous manner, look at wrench.copyDirRecursively() below. Specify forceDelete to force directory overwrite. * * Note: Directories should be passed to this function without a trailing slash. */ exports.copyDirSyncRecursive = function(sourceDir, newDirLocation, opts) { - if (!opts || !opts.preserve) { - try { - if(fs.statSync(newDirLocation).isDirectory()) exports.rmdirSyncRecursive(newDirLocation); - } catch(e) { } - } + try { + if(fs.statSync(newDirLocation).isDirectory()) { + if(typeof opts !== 'undefined' && opts.forceDelete) { + exports.rmdirSyncRecursive(newDirLocation); + } else { + return new Error('You are trying to delete a directory that already exists. Specify forceDelete in the opts argument to override this. Bailing~'); + } + } + } catch(e) { } /* Create the directory where all our junk is moving to; read the mode of the source directory and mirror it */ var checkDir = fs.statSync(sourceDir); @@ -306,18 +310,23 @@ exports.rmdirRecursive = function rmdirRecursive(dir, clbk){ }); }; -/* wrench.copyDirRecursive("directory_to_copy", "new_location", callback); +/* wrench.copyDirRecursive("directory_to_copy", "new_location", {forceDelete: bool}, callback); * * Recursively dives through a directory and moves all its files to a new - * location. + * location. Specify forceDelete to force directory overwrite. * * Note: Directories should be passed to this function without a trailing slash. */ -exports.copyDirRecursive = function copyDirRecursive(srcDir, newDir, clbk) { +exports.copyDirRecursive = function copyDirRecursive(srcDir, newDir, opts, clbk) { fs.stat(newDir, function(err, newDirStat){ - if (!err) return exports.rmdirRecursive(newDir, function(err){ - copyDirRecursive(srcDir, newDir, clbk); - }); + if(!err) { + if(typeof opts !== 'undefined' && typeof opts !== 'function' && opts.forceDelete) + return exports.rmdirRecursive(newDir, function(err){ + copyDirRecursive.apply(this, arguments); + }); + else + return clbk(new Error('You are trying to delete a directory that already exists. Specify forceDelete in an options object to override this.')); + } fs.stat(srcDir, function(err, srcDirStat){ if (err) return clbk(err); diff --git a/readme.md b/readme.md index af8ff89..918871e 100644 --- a/readme.md +++ b/readme.md @@ -38,7 +38,14 @@ wrench.chmodSyncRecursive('my_directory_name', 0755); wrench.chownSyncRecursive("directory", uid, gid); // Deep-copy an existing directory -wrench.copyDirSyncRecursive('directory_to_copy', 'location_where_copy_should_end_up'); +wrench.copyDirSyncRecursive('directory_to_copy', 'location_where_copy_should_end_up', { + forceDelete: bool, // Whether to overwrite existing directory or not + excludeHiddenUnix: bool, // Whether to copy hidden Unix files or not (preceding .) + preserveFiles: bool, // If we're overwriting something and the file already exists, keep the existing + inflateSymlinks: bool, // Whether to follow symlinks or not when copying files + filter: regexp, // A filter to match files against; if matches, do nothing (exclude). + whitelist: bool, // if true every file or directory which doesn't match filter will be ignored +}); // Read lines in from a file until you hit the end var f = new wrench.LineReader('x.txt'); @@ -58,6 +65,9 @@ var files = []; wrench.readdirRecursive('my_directory_name', function(error, curFiles) { // curFiles is what you want }); + +// If you're feeling somewhat masochistic +wrench.copyDirRecursive(srcDir, newDir, {forceDelete: bool /* See sync version */}, callbackfn); ``` Questions, comments? Hit me up. (ryan [at] venodesigns.net | http://twitter.com/ryanmcgrath)