From 793c61eec0557729c4c8fb77c63b4149e09dfe26 Mon Sep 17 00:00:00 2001 From: seanmwalker Date: Fri, 17 Jan 2014 00:45:26 -0600 Subject: [PATCH] Updating wrench rmdirSyncRecursive to support permissions issues for windows. --- lib/wrench.js | 30 +++++++++++++++++++++--------- tests/rmdirSyncRecursive.js | 22 ++++++++++++++++++++++ tests/runner.js | 3 ++- 3 files changed, 45 insertions(+), 10 deletions(-) create mode 100644 tests/rmdirSyncRecursive.js diff --git a/lib/wrench.js b/lib/wrench.js index d2664ec..44bda99 100644 --- a/lib/wrench.js +++ b/lib/wrench.js @@ -12,7 +12,8 @@ */ var fs = require("fs"), - _path = require("path"); + _path = require("path"), + isWindows = !!process.platform.match(/^win/); /* wrench.readdirSyncRecursive("directory_path"); * @@ -122,7 +123,7 @@ exports.readdirRecursive = function(baseDir, fn) { -/* wrench.rmdirSyncRecursive("directory_path", forceDelete, failSilent); +/* wrench.rmdirSyncRecursive("directory_path", failSilent); * * Recursively dives through directories and obliterates everything about it. This is a * Sync-function, which blocks things until it's done. No idea why anybody would want an @@ -140,16 +141,27 @@ exports.rmdirSyncRecursive = function(path, failSilent) { /* Loop through and delete everything in the sub-tree after checking it */ for(var i = 0; i < files.length; i++) { - var currFile = fs.lstatSync(_path.join(path, files[i])); + var file = _path.join(path, files[i]); + var currFile = fs.lstatSync(file); - if(currFile.isDirectory()) // Recursive function back to the beginning - exports.rmdirSyncRecursive(_path.join(path, files[i])); + if(currFile.isDirectory()) { + // Recursive function back to the beginning + exports.rmdirSyncRecursive(file); + } else if(currFile.isSymbolicLink()) { + // Unlink symlinks + if (isWindows) { + fs.chmodSync(file, 666) // Windows needs this unless joyent/node#3006 is resolved.. + } - else if(currFile.isSymbolicLink()) // Unlink symlinks - fs.unlinkSync(_path.join(path, files[i])); + fs.unlinkSync(file); + } else { + // Assume it's a file - perhaps a try/catch belongs here? + if (isWindows) { + fs.chmodSync(file, 666) // Windows needs this unless joyent/node#3006 is resolved.. + } - else // Assume it's a file - perhaps a try/catch belongs here? - fs.unlinkSync(_path.join(path, files[i])); + fs.unlinkSync(file); + } } /* Now that we know everything in the sub-tree has been deleted, we can delete the main diff --git a/tests/rmdirSyncRecursive.js b/tests/rmdirSyncRecursive.js new file mode 100644 index 0000000..db4e9ef --- /dev/null +++ b/tests/rmdirSyncRecursive.js @@ -0,0 +1,22 @@ +var testCase = require('nodeunit').testCase; +var fs = require('fs'); +var wrench = require('../lib/wrench'); +var path = require('path'); + +module.exports = testCase({ + test_rmdirSyncRecursive: function(test) { + var dir = __dirname + '/_tmp/foo/bar'; + + wrench.mkdirSyncRecursive(dir, 0777); + + test.equals(fs.existsSync(dir), true, 'Dir should exist - mkdirSyncRecursive not working?'); + + wrench.rmdirSyncRecursive(dir); + + test.equals(fs.existsSync(dir), false, 'Dir should not exist now...'); + + test.done(); + }, +}); + +// vim: et ts=4 sw=4 diff --git a/tests/runner.js b/tests/runner.js index 8f90dae..e321a15 100644 --- a/tests/runner.js +++ b/tests/runner.js @@ -4,5 +4,6 @@ module.exports = { group_mkdir: require('./mkdir'), group_readdir: require('./readdir'), - group_copydir: require('./copydirsync_unix') + group_copydir: require('./copydirsync_unix'), + group_rmdir: require('./rmdirSyncRecursive') };