diff options
author | Rebecca Turner <me@re-becca.org> | 2016-04-21 10:26:10 +0300 |
---|---|---|
committer | Rebecca Turner <me@re-becca.org> | 2016-04-22 02:35:07 +0300 |
commit | adc515b22775871386cd62390079fb4bf8e1714a (patch) | |
tree | ddbc611be1c6b85dc1fd640a307ba0816e58de5a /node_modules | |
parent | ef53a46906ce872a4541b605dd42a563cc26e614 (diff) |
fs-vacuum@1.2.9
Code cleanup, CI & dep updates.
A fix for AIX where a non-empty directory can cause `fs.rmDir` to fail with `EEXIST` instead of `ENOTEMPTY`
and three new tests
Credit: @othiym23
Credit: @richardlau
Diffstat (limited to 'node_modules')
-rw-r--r-- | node_modules/fs-vacuum/.travis.yml | 14 | ||||
-rw-r--r-- | node_modules/fs-vacuum/package.json | 115 | ||||
-rw-r--r-- | node_modules/fs-vacuum/test/arguments.js | 18 | ||||
-rw-r--r-- | node_modules/fs-vacuum/test/base-leaf-mismatch.js | 14 | ||||
-rw-r--r-- | node_modules/fs-vacuum/test/no-entries-file-no-purge.js | 68 | ||||
-rw-r--r-- | node_modules/fs-vacuum/test/no-entries-link-no-purge.js | 70 | ||||
-rw-r--r-- | node_modules/fs-vacuum/test/no-entries-no-purge.js | 48 | ||||
-rw-r--r-- | node_modules/fs-vacuum/test/no-entries-with-link-purge.js | 72 | ||||
-rw-r--r-- | node_modules/fs-vacuum/test/no-entries-with-purge.js | 62 | ||||
-rw-r--r-- | node_modules/fs-vacuum/test/other-directories-no-purge.js | 64 | ||||
-rw-r--r-- | node_modules/fs-vacuum/test/racy-entries-eexist.js | 119 | ||||
-rw-r--r-- | node_modules/fs-vacuum/test/racy-entries-enotempty.js | 119 | ||||
-rw-r--r-- | node_modules/fs-vacuum/test/racy-entries.js | 104 | ||||
-rw-r--r-- | node_modules/fs-vacuum/vacuum.js | 70 |
14 files changed, 672 insertions, 285 deletions
diff --git a/node_modules/fs-vacuum/.travis.yml b/node_modules/fs-vacuum/.travis.yml new file mode 100644 index 000000000..2325eae02 --- /dev/null +++ b/node_modules/fs-vacuum/.travis.yml @@ -0,0 +1,14 @@ +language: node_js +node_js: + - "5" + - "4" + - iojs + - "0.12" + - "0.10" + - "0.8" +sudo: false +script: "npm test" +before_install: + - "npm -g install npm" +notifications: + slack: npm-inc:kRqQjto7YbINqHPb1X6nS3g8 diff --git a/node_modules/fs-vacuum/package.json b/node_modules/fs-vacuum/package.json index a1eb3f128..7567a84fd 100644 --- a/node_modules/fs-vacuum/package.json +++ b/node_modules/fs-vacuum/package.json @@ -1,63 +1,96 @@ { - "name": "fs-vacuum", - "version": "1.2.7", - "description": "recursively remove empty directories -- to a point", - "main": "vacuum.js", - "scripts": { - "test": "tap test/*.js" + "_args": [ + [ + "fs-vacuum@", + "/Users/rebecca/code/npm" + ] + ], + "_from": "fs-vacuum@latest", + "_id": "fs-vacuum@1.2.9", + "_inCache": true, + "_installable": true, + "_location": "/fs-vacuum", + "_nodeVersion": "5.10.1", + "_npmOperationalInternal": { + "host": "packages-12-west.internal.npmjs.com", + "tmp": "tmp/fs-vacuum-1.2.9.tgz_1461273179969_0.39465441973879933" }, - "repository": { - "type": "git", - "url": "git+https://github.com/npm/fs-vacuum.git" + "_npmUser": { + "email": "ogd@aoaioxxysz.net", + "name": "othiym23" }, - "keywords": [ - "rm", - "rimraf", - "clean" + "_npmVersion": "3.8.7", + "_phantomChildren": {}, + "_requested": { + "name": "fs-vacuum", + "raw": "fs-vacuum@", + "rawSpec": "", + "scope": null, + "spec": "latest", + "type": "tag" + }, + "_requiredBy": [ + "/" ], + "_resolved": "https://registry.npmjs.org/fs-vacuum/-/fs-vacuum-1.2.9.tgz", + "_shasum": "4f90193ab8ea02890995bcd4e804659a5d366b2d", + "_shrinkwrap": null, + "_spec": "fs-vacuum@", + "_where": "/Users/rebecca/code/npm", "author": { - "name": "Forrest L Norvell", - "email": "ogd@aoaioxxysz.net" + "email": "ogd@aoaioxxysz.net", + "name": "Forrest L Norvell" }, - "license": "ISC", "bugs": { "url": "https://github.com/npm/fs-vacuum/issues" }, - "homepage": "https://github.com/npm/fs-vacuum", - "devDependencies": { - "mkdirp": "^0.5.0", - "tap": "^0.4.11", - "tmp": "0.0.24" - }, "dependencies": { "graceful-fs": "^4.1.2", "path-is-inside": "^1.0.1", - "rimraf": "^2.2.8" - }, - "gitHead": "498a44d987ee11bc355fe1ec479d55a689fc37ef", - "_id": "fs-vacuum@1.2.7", - "_shasum": "75e501f9d2889ba2fe9fe12f936ba5dad50ca35a", - "_from": "fs-vacuum@>=1.2.7 <1.3.0", - "_npmVersion": "2.14.3", - "_nodeVersion": "2.2.2", - "_npmUser": { - "name": "zkat", - "email": "kat@sykosomatic.org" + "rimraf": "^2.5.2" }, + "description": "recursively remove empty directories -- to a point", + "devDependencies": { + "errno": "~0.1.0", + "mkdirp": "^0.5.1", + "require-inject": "~1.3.0", + "standard": "^6.0.8", + "tap": "^5.7.1", + "tmp": "0.0.28" + }, + "directories": {}, "dist": { - "shasum": "75e501f9d2889ba2fe9fe12f936ba5dad50ca35a", - "tarball": "http://registry.npmjs.org/fs-vacuum/-/fs-vacuum-1.2.7.tgz" + "shasum": "4f90193ab8ea02890995bcd4e804659a5d366b2d", + "tarball": "https://registry.npmjs.org/fs-vacuum/-/fs-vacuum-1.2.9.tgz" }, + "gitHead": "acff37c635731a0169367acb32338d9d4e7d615c", + "homepage": "https://github.com/npm/fs-vacuum", + "keywords": [ + "rm", + "rimraf", + "clean" + ], + "license": "ISC", + "main": "vacuum.js", "maintainers": [ { - "name": "othiym23", - "email": "ogd@aoaioxxysz.net" + "email": "ogd@aoaioxxysz.net", + "name": "othiym23" }, { - "name": "zkat", - "email": "kat@sykosomatic.org" + "email": "kat@sykosomatic.org", + "name": "zkat" } ], - "directories": {}, - "_resolved": "https://registry.npmjs.org/fs-vacuum/-/fs-vacuum-1.2.7.tgz" + "name": "fs-vacuum", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git+https://github.com/npm/fs-vacuum.git" + }, + "scripts": { + "test": "standard && tap test/*.js" + }, + "version": "1.2.9" } diff --git a/node_modules/fs-vacuum/test/arguments.js b/node_modules/fs-vacuum/test/arguments.js index d77ce0627..17ff2ee59 100644 --- a/node_modules/fs-vacuum/test/arguments.js +++ b/node_modules/fs-vacuum/test/arguments.js @@ -1,10 +1,10 @@ -var test = require("tap").test +var test = require('tap').test -var vacuum = require("../vacuum.js") +var vacuum = require('../vacuum.js') -test("vacuum throws on missing parameters", function (t) { - t.throws(vacuum, "called with no parameters") - t.throws(function () { vacuum("directory", {}) }, "called with no callback") +test('vacuum throws on missing parameters', function (t) { + t.throws(vacuum, 'called with no parameters') + t.throws(function () { vacuum('directory', {}) }, 'called with no callback') t.end() }) @@ -12,12 +12,12 @@ test("vacuum throws on missing parameters", function (t) { test('vacuum throws on incorrect types ("Forrest is pedantic" section)', function (t) { t.throws(function () { vacuum({}, {}, function () {}) - }, "called with path parameter of incorrect type") + }, 'called with path parameter of incorrect type') t.throws(function () { - vacuum("directory", "directory", function () {}) - }, "called with options of wrong type") + vacuum('directory', 'directory', function () {}) + }, 'called with options of wrong type') t.throws(function () { - vacuum("directory", {}, "whoops") + vacuum('directory', {}, 'whoops') }, "called with callback that isn't callable") t.end() diff --git a/node_modules/fs-vacuum/test/base-leaf-mismatch.js b/node_modules/fs-vacuum/test/base-leaf-mismatch.js index cfdf074fe..1a6c53565 100644 --- a/node_modules/fs-vacuum/test/base-leaf-mismatch.js +++ b/node_modules/fs-vacuum/test/base-leaf-mismatch.js @@ -1,14 +1,14 @@ -var test = require("tap").test +var test = require('tap').test -var vacuum = require("../vacuum.js") +var vacuum = require('../vacuum.js') -test("vacuum errors when base is set and path is not under it", function (t) { - vacuum("/a/made/up/path", {base : "/root/elsewhere"}, function (er) { - t.ok(er, "got an error") +test('vacuum errors when base is set and path is not under it', function (t) { + vacuum('/a/made/up/path', {base: '/root/elsewhere'}, function (er) { + t.ok(er, 'got an error') t.equal( er.message, - "/a/made/up/path is not a child of /root/elsewhere", - "got the expected error message" + '/a/made/up/path is not a child of /root/elsewhere', + 'got the expected error message' ) t.end() diff --git a/node_modules/fs-vacuum/test/no-entries-file-no-purge.js b/node_modules/fs-vacuum/test/no-entries-file-no-purge.js index 6a6e51bca..819adcdcb 100644 --- a/node_modules/fs-vacuum/test/no-entries-file-no-purge.js +++ b/node_modules/fs-vacuum/test/no-entries-file-no-purge.js @@ -1,40 +1,40 @@ -var path = require("path") +var path = require('path') -var test = require("tap").test -var statSync = require("graceful-fs").statSync -var writeFile = require("graceful-fs").writeFile -var readdirSync = require("graceful-fs").readdirSync -var mkdtemp = require("tmp").dir -var mkdirp = require("mkdirp") +var test = require('tap').test +var statSync = require('graceful-fs').statSync +var writeFile = require('graceful-fs').writeFile +var readdirSync = require('graceful-fs').readdirSync +var mkdtemp = require('tmp').dir +var mkdirp = require('mkdirp') -var vacuum = require("../vacuum.js") +var vacuum = require('../vacuum.js') // CONSTANTS var TEMP_OPTIONS = { - unsafeCleanup : true, - mode : "0700" + unsafeCleanup: true, + mode: '0700' } -var SHORT_PATH = path.join("i", "am", "a", "path") -var PARTIAL_PATH = path.join(SHORT_PATH, "that", "ends", "at", "a") -var FULL_PATH = path.join(PARTIAL_PATH, "file") +var SHORT_PATH = path.join('i', 'am', 'a', 'path') +var PARTIAL_PATH = path.join(SHORT_PATH, 'that', 'ends', 'at', 'a') +var FULL_PATH = path.join(PARTIAL_PATH, 'file') var messages = [] -function log() { messages.push(Array.prototype.slice.call(arguments).join(" ")) } +function log () { messages.push(Array.prototype.slice.call(arguments).join(' ')) } var testBase, partialPath, fullPath -test("xXx setup xXx", function (t) { +test('xXx setup xXx', function (t) { mkdtemp(TEMP_OPTIONS, function (er, tmpdir) { - t.ifError(er, "temp directory exists") + t.ifError(er, 'temp directory exists') - testBase = path.resolve(tmpdir, SHORT_PATH) + testBase = path.resolve(tmpdir, SHORT_PATH) partialPath = path.resolve(tmpdir, PARTIAL_PATH) - fullPath = path.resolve(tmpdir, FULL_PATH) + fullPath = path.resolve(tmpdir, FULL_PATH) mkdirp(partialPath, function (er) { - t.ifError(er, "made test path") + t.ifError(er, 'made test path') - writeFile(fullPath, new Buffer("hi"), function (er) { - t.ifError(er, "made file") + writeFile(fullPath, new Buffer('hi'), function (er) { + t.ifError(er, 'made file') t.end() }) @@ -42,36 +42,36 @@ test("xXx setup xXx", function (t) { }) }) -test("remove up to a point", function (t) { - vacuum(fullPath, {purge : false, base : testBase, log : log}, function (er) { - t.ifError(er, "cleaned up to base") +test('remove up to a point', function (t) { + vacuum(fullPath, {purge: false, base: testBase, log: log}, function (er) { + t.ifError(er, 'cleaned up to base') - t.equal(messages.length, 6, "got 5 removal & 1 finish message") - t.equal(messages[5], "finished vacuuming up to " + testBase) + t.equal(messages.length, 6, 'got 5 removal & 1 finish message') + t.equal(messages[5], 'finished vacuuming up to ' + testBase) var stat var verifyPath = fullPath - function verify() { stat = statSync(verifyPath) } + function verify () { stat = statSync(verifyPath) } // handle the file separately - t.throws(verify, verifyPath + " cannot be statted") - t.notOk(stat && stat.isFile(), verifyPath + " is totally gone") + t.throws(verify, verifyPath + ' cannot be statted') + t.notOk(stat && stat.isFile(), verifyPath + ' is totally gone') verifyPath = path.dirname(verifyPath) for (var i = 0; i < 4; i++) { - t.throws(verify, verifyPath + " cannot be statted") - t.notOk(stat && stat.isDirectory(), verifyPath + " is totally gone") + t.throws(verify, verifyPath + ' cannot be statted') + t.notOk(stat && stat.isDirectory(), verifyPath + ' is totally gone') verifyPath = path.dirname(verifyPath) } t.doesNotThrow(function () { stat = statSync(testBase) - }, testBase + " can be statted") - t.ok(stat && stat.isDirectory(), testBase + " is still a directory") + }, testBase + ' can be statted') + t.ok(stat && stat.isDirectory(), testBase + ' is still a directory') var files = readdirSync(testBase) - t.equal(files.length, 0, "nothing left in base directory") + t.equal(files.length, 0, 'nothing left in base directory') t.end() }) diff --git a/node_modules/fs-vacuum/test/no-entries-link-no-purge.js b/node_modules/fs-vacuum/test/no-entries-link-no-purge.js index 087c039d6..833d970d6 100644 --- a/node_modules/fs-vacuum/test/no-entries-link-no-purge.js +++ b/node_modules/fs-vacuum/test/no-entries-link-no-purge.js @@ -1,46 +1,46 @@ -var path = require("path") +var path = require('path') -var test = require("tap").test -var statSync = require("graceful-fs").statSync -var symlinkSync = require("graceful-fs").symlinkSync -var readdirSync = require("graceful-fs").readdirSync -var mkdtemp = require("tmp").dir -var mkdirp = require("mkdirp") +var test = require('tap').test +var statSync = require('graceful-fs').statSync +var symlinkSync = require('graceful-fs').symlinkSync +var readdirSync = require('graceful-fs').readdirSync +var mkdtemp = require('tmp').dir +var mkdirp = require('mkdirp') -var vacuum = require("../vacuum.js") +var vacuum = require('../vacuum.js') // CONSTANTS var TEMP_OPTIONS = { - unsafeCleanup : true, - mode : "0700" + unsafeCleanup: true, + mode: '0700' } -var SHORT_PATH = path.join("i", "am", "a", "path") -var TARGET_PATH = path.join("target-link", "in", "the", "middle") -var PARTIAL_PATH = path.join(SHORT_PATH, "with", "a") -var FULL_PATH = path.join(PARTIAL_PATH, "link") -var EXPANDO_PATH = path.join(SHORT_PATH, "with", "a", "link", "in", "the", "middle") +var SHORT_PATH = path.join('i', 'am', 'a', 'path') +var TARGET_PATH = path.join('target-link', 'in', 'the', 'middle') +var PARTIAL_PATH = path.join(SHORT_PATH, 'with', 'a') +var FULL_PATH = path.join(PARTIAL_PATH, 'link') +var EXPANDO_PATH = path.join(SHORT_PATH, 'with', 'a', 'link', 'in', 'the', 'middle') var messages = [] -function log() { messages.push(Array.prototype.slice.call(arguments).join(" ")) } +function log () { messages.push(Array.prototype.slice.call(arguments).join(' ')) } var testBase, targetPath, partialPath, fullPath, expandoPath -test("xXx setup xXx", function (t) { +test('xXx setup xXx', function (t) { mkdtemp(TEMP_OPTIONS, function (er, tmpdir) { - t.ifError(er, "temp directory exists") + t.ifError(er, 'temp directory exists') - testBase = path.resolve(tmpdir, SHORT_PATH) - targetPath = path.resolve(tmpdir, TARGET_PATH) + testBase = path.resolve(tmpdir, SHORT_PATH) + targetPath = path.resolve(tmpdir, TARGET_PATH) partialPath = path.resolve(tmpdir, PARTIAL_PATH) - fullPath = path.resolve(tmpdir, FULL_PATH) + fullPath = path.resolve(tmpdir, FULL_PATH) expandoPath = path.resolve(tmpdir, EXPANDO_PATH) mkdirp(partialPath, function (er) { - t.ifError(er, "made test path") + t.ifError(er, 'made test path') mkdirp(targetPath, function (er) { - t.ifError(er, "made target path") + t.ifError(er, 'made target path') - symlinkSync(path.join(tmpdir, "target-link"), fullPath) + symlinkSync(path.join(tmpdir, 'target-link'), fullPath) t.end() }) @@ -48,30 +48,30 @@ test("xXx setup xXx", function (t) { }) }) -test("remove up to a point", function (t) { - vacuum(expandoPath, {purge : false, base : testBase, log : log}, function (er) { - t.ifError(er, "cleaned up to base") +test('remove up to a point', function (t) { + vacuum(expandoPath, {purge: false, base: testBase, log: log}, function (er) { + t.ifError(er, 'cleaned up to base') - t.equal(messages.length, 7, "got 6 removal & 1 finish message") - t.equal(messages[6], "finished vacuuming up to " + testBase) + t.equal(messages.length, 7, 'got 6 removal & 1 finish message') + t.equal(messages[6], 'finished vacuuming up to ' + testBase) var stat var verifyPath = expandoPath - function verify() { stat = statSync(verifyPath) } + function verify () { stat = statSync(verifyPath) } for (var i = 0; i < 6; i++) { - t.throws(verify, verifyPath + " cannot be statted") - t.notOk(stat && stat.isDirectory(), verifyPath + " is totally gone") + t.throws(verify, verifyPath + ' cannot be statted') + t.notOk(stat && stat.isDirectory(), verifyPath + ' is totally gone') verifyPath = path.dirname(verifyPath) } t.doesNotThrow(function () { stat = statSync(testBase) - }, testBase + " can be statted") - t.ok(stat && stat.isDirectory(), testBase + " is still a directory") + }, testBase + ' can be statted') + t.ok(stat && stat.isDirectory(), testBase + ' is still a directory') var files = readdirSync(testBase) - t.equal(files.length, 0, "nothing left in base directory") + t.equal(files.length, 0, 'nothing left in base directory') t.end() }) diff --git a/node_modules/fs-vacuum/test/no-entries-no-purge.js b/node_modules/fs-vacuum/test/no-entries-no-purge.js index 346ab5669..03c17923c 100644 --- a/node_modules/fs-vacuum/test/no-entries-no-purge.js +++ b/node_modules/fs-vacuum/test/no-entries-no-purge.js @@ -1,60 +1,60 @@ -var path = require("path") +var path = require('path') -var test = require("tap").test -var statSync = require("graceful-fs").statSync -var mkdtemp = require("tmp").dir -var mkdirp = require("mkdirp") +var test = require('tap').test +var statSync = require('graceful-fs').statSync +var mkdtemp = require('tmp').dir +var mkdirp = require('mkdirp') -var vacuum = require("../vacuum.js") +var vacuum = require('../vacuum.js') // CONSTANTS var TEMP_OPTIONS = { - unsafeCleanup : true, - mode : "0700" + unsafeCleanup: true, + mode: '0700' } -var SHORT_PATH = path.join("i", "am", "a", "path") -var LONG_PATH = path.join(SHORT_PATH, "of", "a", "certain", "length") +var SHORT_PATH = path.join('i', 'am', 'a', 'path') +var LONG_PATH = path.join(SHORT_PATH, 'of', 'a', 'certain', 'length') var messages = [] -function log() { messages.push(Array.prototype.slice.call(arguments).join(" ")) } +function log () { messages.push(Array.prototype.slice.call(arguments).join(' ')) } var testPath, testBase -test("xXx setup xXx", function (t) { +test('xXx setup xXx', function (t) { mkdtemp(TEMP_OPTIONS, function (er, tmpdir) { - t.ifError(er, "temp directory exists") + t.ifError(er, 'temp directory exists') testBase = path.resolve(tmpdir, SHORT_PATH) testPath = path.resolve(tmpdir, LONG_PATH) mkdirp(testPath, function (er) { - t.ifError(er, "made test path") + t.ifError(er, 'made test path') t.end() }) }) }) -test("remove up to a point", function (t) { - vacuum(testPath, {purge : false, base : testBase, log : log}, function (er) { - t.ifError(er, "cleaned up to base") +test('remove up to a point', function (t) { + vacuum(testPath, {purge: false, base: testBase, log: log}, function (er) { + t.ifError(er, 'cleaned up to base') - t.equal(messages.length, 5, "got 4 removal & 1 finish message") - t.equal(messages[4], "finished vacuuming up to " + testBase) + t.equal(messages.length, 5, 'got 4 removal & 1 finish message') + t.equal(messages[4], 'finished vacuuming up to ' + testBase) var stat var verifyPath = testPath - function verify() { stat = statSync(verifyPath) } + function verify () { stat = statSync(verifyPath) } for (var i = 0; i < 4; i++) { - t.throws(verify, verifyPath + " cannot be statted") - t.notOk(stat && stat.isDirectory(), verifyPath + " is totally gone") + t.throws(verify, verifyPath + ' cannot be statted') + t.notOk(stat && stat.isDirectory(), verifyPath + ' is totally gone') verifyPath = path.dirname(verifyPath) } t.doesNotThrow(function () { stat = statSync(testBase) - }, testBase + " can be statted") - t.ok(stat && stat.isDirectory(), testBase + " is still a directory") + }, testBase + ' can be statted') + t.ok(stat && stat.isDirectory(), testBase + ' is still a directory') t.end() }) diff --git a/node_modules/fs-vacuum/test/no-entries-with-link-purge.js b/node_modules/fs-vacuum/test/no-entries-with-link-purge.js index 4ed1a3939..990b69d8a 100644 --- a/node_modules/fs-vacuum/test/no-entries-with-link-purge.js +++ b/node_modules/fs-vacuum/test/no-entries-with-link-purge.js @@ -1,47 +1,47 @@ -var path = require("path") +var path = require('path') -var test = require("tap").test -var statSync = require("graceful-fs").statSync -var writeFileSync = require("graceful-fs").writeFileSync -var symlinkSync = require("graceful-fs").symlinkSync -var mkdtemp = require("tmp").dir -var mkdirp = require("mkdirp") +var test = require('tap').test +var statSync = require('graceful-fs').statSync +var writeFileSync = require('graceful-fs').writeFileSync +var symlinkSync = require('graceful-fs').symlinkSync +var mkdtemp = require('tmp').dir +var mkdirp = require('mkdirp') -var vacuum = require("../vacuum.js") +var vacuum = require('../vacuum.js') // CONSTANTS var TEMP_OPTIONS = { - unsafeCleanup : true, - mode : "0700" + unsafeCleanup: true, + mode: '0700' } -var SHORT_PATH = path.join("i", "am", "a", "path") -var TARGET_PATH = "link-target" -var FIRST_FILE = path.join(TARGET_PATH, "monsieurs") -var SECOND_FILE = path.join(TARGET_PATH, "mesdames") -var PARTIAL_PATH = path.join(SHORT_PATH, "with", "a", "definite") -var FULL_PATH = path.join(PARTIAL_PATH, "target") +var SHORT_PATH = path.join('i', 'am', 'a', 'path') +var TARGET_PATH = 'link-target' +var FIRST_FILE = path.join(TARGET_PATH, 'monsieurs') +var SECOND_FILE = path.join(TARGET_PATH, 'mesdames') +var PARTIAL_PATH = path.join(SHORT_PATH, 'with', 'a', 'definite') +var FULL_PATH = path.join(PARTIAL_PATH, 'target') var messages = [] -function log() { messages.push(Array.prototype.slice.call(arguments).join(" ")) } +function log () { messages.push(Array.prototype.slice.call(arguments).join(' ')) } var testBase, partialPath, fullPath, targetPath -test("xXx setup xXx", function (t) { +test('xXx setup xXx', function (t) { mkdtemp(TEMP_OPTIONS, function (er, tmpdir) { - t.ifError(er, "temp directory exists") + t.ifError(er, 'temp directory exists') - testBase = path.resolve(tmpdir, SHORT_PATH) - targetPath = path.resolve(tmpdir, TARGET_PATH) + testBase = path.resolve(tmpdir, SHORT_PATH) + targetPath = path.resolve(tmpdir, TARGET_PATH) partialPath = path.resolve(tmpdir, PARTIAL_PATH) - fullPath = path.resolve(tmpdir, FULL_PATH) + fullPath = path.resolve(tmpdir, FULL_PATH) mkdirp(partialPath, function (er) { - t.ifError(er, "made test path") + t.ifError(er, 'made test path') mkdirp(targetPath, function (er) { - t.ifError(er, "made target path") + t.ifError(er, 'made target path') writeFileSync(path.resolve(tmpdir, FIRST_FILE), new Buffer("c'est vraiment joli")) - writeFileSync(path.resolve(tmpdir, SECOND_FILE), new Buffer("oui oui")) + writeFileSync(path.resolve(tmpdir, SECOND_FILE), new Buffer('oui oui')) symlinkSync(targetPath, fullPath) t.end() @@ -50,28 +50,28 @@ test("xXx setup xXx", function (t) { }) }) -test("remove up to a point", function (t) { - vacuum(fullPath, {purge : true, base : testBase, log : log}, function (er) { - t.ifError(er, "cleaned up to base") +test('remove up to a point', function (t) { + vacuum(fullPath, {purge: true, base: testBase, log: log}, function (er) { + t.ifError(er, 'cleaned up to base') - t.equal(messages.length, 5, "got 4 removal & 1 finish message") - t.equal(messages[0], "purging " + fullPath) - t.equal(messages[4], "finished vacuuming up to " + testBase) + t.equal(messages.length, 5, 'got 4 removal & 1 finish message') + t.equal(messages[0], 'purging ' + fullPath) + t.equal(messages[4], 'finished vacuuming up to ' + testBase) var stat var verifyPath = fullPath - function verify() { stat = statSync(verifyPath) } + function verify () { stat = statSync(verifyPath) } for (var i = 0; i < 4; i++) { - t.throws(verify, verifyPath + " cannot be statted") - t.notOk(stat && stat.isDirectory(), verifyPath + " is totally gone") + t.throws(verify, verifyPath + ' cannot be statted') + t.notOk(stat && stat.isDirectory(), verifyPath + ' is totally gone') verifyPath = path.dirname(verifyPath) } t.doesNotThrow(function () { stat = statSync(testBase) - }, testBase + " can be statted") - t.ok(stat && stat.isDirectory(), testBase + " is still a directory") + }, testBase + ' can be statted') + t.ok(stat && stat.isDirectory(), testBase + ' is still a directory') t.end() }) diff --git a/node_modules/fs-vacuum/test/no-entries-with-purge.js b/node_modules/fs-vacuum/test/no-entries-with-purge.js index 10fa55855..d3ab0c2b6 100644 --- a/node_modules/fs-vacuum/test/no-entries-with-purge.js +++ b/node_modules/fs-vacuum/test/no-entries-with-purge.js @@ -1,66 +1,66 @@ -var path = require("path") +var path = require('path') -var test = require("tap").test -var statSync = require("graceful-fs").statSync -var writeFileSync = require("graceful-fs").writeFileSync -var mkdtemp = require("tmp").dir -var mkdirp = require("mkdirp") +var test = require('tap').test +var statSync = require('graceful-fs').statSync +var writeFileSync = require('graceful-fs').writeFileSync +var mkdtemp = require('tmp').dir +var mkdirp = require('mkdirp') -var vacuum = require("../vacuum.js") +var vacuum = require('../vacuum.js') // CONSTANTS var TEMP_OPTIONS = { - unsafeCleanup : true, - mode : "0700" + unsafeCleanup: true, + mode: '0700' } -var SHORT_PATH = path.join("i", "am", "a", "path") -var LONG_PATH = path.join(SHORT_PATH, "of", "a", "certain", "kind") -var FIRST_FILE = path.join(LONG_PATH, "monsieurs") -var SECOND_FILE = path.join(LONG_PATH, "mesdames") +var SHORT_PATH = path.join('i', 'am', 'a', 'path') +var LONG_PATH = path.join(SHORT_PATH, 'of', 'a', 'certain', 'kind') +var FIRST_FILE = path.join(LONG_PATH, 'monsieurs') +var SECOND_FILE = path.join(LONG_PATH, 'mesdames') var messages = [] -function log() { messages.push(Array.prototype.slice.call(arguments).join(" ")) } +function log () { messages.push(Array.prototype.slice.call(arguments).join(' ')) } var testPath, testBase -test("xXx setup xXx", function (t) { +test('xXx setup xXx', function (t) { mkdtemp(TEMP_OPTIONS, function (er, tmpdir) { - t.ifError(er, "temp directory exists") + t.ifError(er, 'temp directory exists') - testBase = path.resolve(tmpdir, SHORT_PATH) - testPath = path.resolve(tmpdir, LONG_PATH) + testBase = path.resolve(tmpdir, SHORT_PATH) + testPath = path.resolve(tmpdir, LONG_PATH) mkdirp(testPath, function (er) { - t.ifError(er, "made test path") + t.ifError(er, 'made test path') writeFileSync(path.resolve(tmpdir, FIRST_FILE), new Buffer("c'est vraiment joli")) - writeFileSync(path.resolve(tmpdir, SECOND_FILE), new Buffer("oui oui")) + writeFileSync(path.resolve(tmpdir, SECOND_FILE), new Buffer('oui oui')) t.end() }) }) }) -test("remove up to a point", function (t) { - vacuum(testPath, {purge : true, base : testBase, log : log}, function (er) { - t.ifError(er, "cleaned up to base") +test('remove up to a point', function (t) { + vacuum(testPath, {purge: true, base: testBase, log: log}, function (er) { + t.ifError(er, 'cleaned up to base') - t.equal(messages.length, 5, "got 4 removal & 1 finish message") - t.equal(messages[0], "purging " + testPath) - t.equal(messages[4], "finished vacuuming up to " + testBase) + t.equal(messages.length, 5, 'got 4 removal & 1 finish message') + t.equal(messages[0], 'purging ' + testPath) + t.equal(messages[4], 'finished vacuuming up to ' + testBase) var stat var verifyPath = testPath - function verify() { stat = statSync(verifyPath) } + function verify () { stat = statSync(verifyPath) } for (var i = 0; i < 4; i++) { - t.throws(verify, verifyPath + " cannot be statted") - t.notOk(stat && stat.isDirectory(), verifyPath + " is totally gone") + t.throws(verify, verifyPath + ' cannot be statted') + t.notOk(stat && stat.isDirectory(), verifyPath + ' is totally gone') verifyPath = path.dirname(verifyPath) } t.doesNotThrow(function () { stat = statSync(testBase) - }, testBase + " can be statted") - t.ok(stat && stat.isDirectory(), testBase + " is still a directory") + }, testBase + ' can be statted') + t.ok(stat && stat.isDirectory(), testBase + ' is still a directory') t.end() }) diff --git a/node_modules/fs-vacuum/test/other-directories-no-purge.js b/node_modules/fs-vacuum/test/other-directories-no-purge.js index dce785623..b18f7eb27 100644 --- a/node_modules/fs-vacuum/test/other-directories-no-purge.js +++ b/node_modules/fs-vacuum/test/other-directories-no-purge.js @@ -1,38 +1,38 @@ -var path = require("path") +var path = require('path') -var test = require("tap").test -var statSync = require("graceful-fs").statSync -var mkdtemp = require("tmp").dir -var mkdirp = require("mkdirp") +var test = require('tap').test +var statSync = require('graceful-fs').statSync +var mkdtemp = require('tmp').dir +var mkdirp = require('mkdirp') -var vacuum = require("../vacuum.js") +var vacuum = require('../vacuum.js') // CONSTANTS var TEMP_OPTIONS = { - unsafeCleanup : true, - mode : "0700" + unsafeCleanup: true, + mode: '0700' } -var SHORT_PATH = path.join("i", "am", "a", "path") -var REMOVE_PATH = path.join(SHORT_PATH, "of", "a", "certain", "length") -var OTHER_PATH = path.join(SHORT_PATH, "of", "no", "qualities") +var SHORT_PATH = path.join('i', 'am', 'a', 'path') +var REMOVE_PATH = path.join(SHORT_PATH, 'of', 'a', 'certain', 'length') +var OTHER_PATH = path.join(SHORT_PATH, 'of', 'no', 'qualities') var messages = [] -function log() { messages.push(Array.prototype.slice.call(arguments).join(" ")) } +function log () { messages.push(Array.prototype.slice.call(arguments).join(' ')) } var testBase, testPath, otherPath -test("xXx setup xXx", function (t) { +test('xXx setup xXx', function (t) { mkdtemp(TEMP_OPTIONS, function (er, tmpdir) { - t.ifError(er, "temp directory exists") + t.ifError(er, 'temp directory exists') - testBase = path.resolve(tmpdir, SHORT_PATH) - testPath = path.resolve(tmpdir, REMOVE_PATH) + testBase = path.resolve(tmpdir, SHORT_PATH) + testPath = path.resolve(tmpdir, REMOVE_PATH) otherPath = path.resolve(tmpdir, OTHER_PATH) mkdirp(testPath, function (er) { - t.ifError(er, "made test path") + t.ifError(er, 'made test path') mkdirp(otherPath, function (er) { - t.ifError(er, "made other path") + t.ifError(er, 'made other path') t.end() }) @@ -40,36 +40,36 @@ test("xXx setup xXx", function (t) { }) }) -test("remove up to a point", function (t) { - vacuum(testPath, {purge : false, base : testBase, log : log}, function (er) { - t.ifError(er, "cleaned up to base") +test('remove up to a point', function (t) { + vacuum(testPath, {purge: false, base: testBase, log: log}, function (er) { + t.ifError(er, 'cleaned up to base') - t.equal(messages.length, 4, "got 3 removal & 1 finish message") + t.equal(messages.length, 4, 'got 3 removal & 1 finish message') t.equal( - messages[3], "quitting because other entries in " + testBase + "/of", - "got expected final message" + messages[3], 'quitting because other entries in ' + testBase + '/of', + 'got expected final message' ) var stat var verifyPath = testPath - function verify() { stat = statSync(verifyPath) } + function verify () { stat = statSync(verifyPath) } for (var i = 0; i < 3; i++) { - t.throws(verify, verifyPath + " cannot be statted") - t.notOk(stat && stat.isDirectory(), verifyPath + " is totally gone") + t.throws(verify, verifyPath + ' cannot be statted') + t.notOk(stat && stat.isDirectory(), verifyPath + ' is totally gone') verifyPath = path.dirname(verifyPath) } t.doesNotThrow(function () { stat = statSync(otherPath) - }, otherPath + " can be statted") - t.ok(stat && stat.isDirectory(), otherPath + " is still a directory") + }, otherPath + ' can be statted') + t.ok(stat && stat.isDirectory(), otherPath + ' is still a directory') - var intersection = path.join(testBase, "of") + var intersection = path.join(testBase, 'of') t.doesNotThrow(function () { stat = statSync(intersection) - }, intersection + " can be statted") - t.ok(stat && stat.isDirectory(), intersection + " is still a directory") + }, intersection + ' can be statted') + t.ok(stat && stat.isDirectory(), intersection + ' is still a directory') t.end() }) diff --git a/node_modules/fs-vacuum/test/racy-entries-eexist.js b/node_modules/fs-vacuum/test/racy-entries-eexist.js new file mode 100644 index 000000000..d467e996d --- /dev/null +++ b/node_modules/fs-vacuum/test/racy-entries-eexist.js @@ -0,0 +1,119 @@ +var path = require('path') + +var test = require('tap').test + +var readdir = require('graceful-fs').readdir +var readdirSync = require('graceful-fs').readdirSync +var rmdir = require('graceful-fs').rmdir +var statSync = require('graceful-fs').statSync +var writeFile = require('graceful-fs').writeFile +var mkdirp = require('mkdirp') +var mkdtemp = require('tmp').dir +var tmpFile = require('tmp').file +var EEXIST = require('errno').code.EEXIST +var ENOTEMPTY = require('errno').code.ENOTEMPTY + +var requireInject = require('require-inject') +var vacuum = requireInject('../vacuum.js', { + 'graceful-fs': { + 'lstat': require('graceful-fs').lstat, + 'readdir': function (dir, cb) { + readdir(dir, function (err, files) { + // Simulate racy removal by creating a file after vacuum + // thinks the directory is empty + if (dir === partialPath && files.length === 0) { + tmpFile({dir: dir}, function (err, path, fd) { + if (err) throw err + cb(err, files) + }) + } else { + cb(err, files) + } + }) + }, + 'rmdir': function (dir, cb) { + rmdir(dir, function (err) { + // Force EEXIST error from rmdir if the directory is non-empty + var mockErr = EEXIST + if (err) { + if (err.code === ENOTEMPTY.code) { + err.code = err.errno = mockErr.code + err.message = mockErr.code + ': ' + mockErr.description + ', ' + err.syscall + ' \'' + dir + '\'' + } + } + cb(err) + }) + }, + 'unlink': require('graceful-fs').unlink + } +}) + +// CONSTANTS +var TEMP_OPTIONS = { + unsafeCleanup: true, + mode: '0700' +} +var SHORT_PATH = path.join('i', 'am', 'a', 'path') +var PARTIAL_PATH = path.join(SHORT_PATH, 'that', 'ends', 'at', 'a') +var FULL_PATH = path.join(PARTIAL_PATH, 'file') + +var messages = [] +function log () { messages.push(Array.prototype.slice.call(arguments).join(' ')) } + +var testBase, partialPath, fullPath +test('xXx setup xXx', function (t) { + mkdtemp(TEMP_OPTIONS, function (er, tmpdir) { + t.ifError(er, 'temp directory exists') + + testBase = path.resolve(tmpdir, SHORT_PATH) + partialPath = path.resolve(tmpdir, PARTIAL_PATH) + fullPath = path.resolve(tmpdir, FULL_PATH) + + mkdirp(partialPath, function (er) { + t.ifError(er, 'made test path') + + writeFile(fullPath, new Buffer('hi'), function (er) { + t.ifError(er, 'made file') + + t.end() + }) + }) + }) +}) + +test('racy removal should quit gracefully', function (t) { + vacuum(fullPath, {purge: false, base: testBase, log: log}, function (er) { + t.ifError(er, 'cleaned up to base') + + t.equal(messages.length, 3, 'got 2 removal & 1 quit message') + t.equal(messages[2], 'quitting because new (racy) entries in ' + partialPath) + + var stat + var verifyPath = fullPath + + function verify () { stat = statSync(verifyPath) } + + // handle the file separately + t.throws(verify, verifyPath + ' cannot be statted') + t.notOk(stat && stat.isFile(), verifyPath + ' is totally gone') + verifyPath = path.dirname(verifyPath) + + for (var i = 0; i < 4; i++) { + t.doesNotThrow(function () { + stat = statSync(verifyPath) + }, verifyPath + ' can be statted') + t.ok(stat && stat.isDirectory(), verifyPath + ' is still a directory') + verifyPath = path.dirname(verifyPath) + } + + t.doesNotThrow(function () { + stat = statSync(testBase) + }, testBase + ' can be statted') + t.ok(stat && stat.isDirectory(), testBase + ' is still a directory') + + var files = readdirSync(testBase) + t.equal(files.length, 1, 'base directory untouched') + + t.end() + }) +}) diff --git a/node_modules/fs-vacuum/test/racy-entries-enotempty.js b/node_modules/fs-vacuum/test/racy-entries-enotempty.js new file mode 100644 index 000000000..decc3807d --- /dev/null +++ b/node_modules/fs-vacuum/test/racy-entries-enotempty.js @@ -0,0 +1,119 @@ +var path = require('path') + +var test = require('tap').test + +var readdir = require('graceful-fs').readdir +var readdirSync = require('graceful-fs').readdirSync +var rmdir = require('graceful-fs').rmdir +var statSync = require('graceful-fs').statSync +var writeFile = require('graceful-fs').writeFile +var mkdirp = require('mkdirp') +var mkdtemp = require('tmp').dir +var tmpFile = require('tmp').file +var EEXIST = require('errno').code.EEXIST +var ENOTEMPTY = require('errno').code.ENOTEMPTY + +var requireInject = require('require-inject') +var vacuum = requireInject('../vacuum.js', { + 'graceful-fs': { + 'lstat': require('graceful-fs').lstat, + 'readdir': function (dir, cb) { + readdir(dir, function (err, files) { + // Simulate racy removal by creating a file after vacuum + // thinks the directory is empty + if (dir === partialPath && files.length === 0) { + tmpFile({dir: dir}, function (err, path, fd) { + if (err) throw err + cb(err, files) + }) + } else { + cb(err, files) + } + }) + }, + 'rmdir': function (dir, cb) { + rmdir(dir, function (err) { + // Force ENOTEMPTY error from rmdir if the directory is non-empty + var mockErr = ENOTEMPTY + if (err) { + if (err.code === EEXIST.code) { + err.code = err.errno = mockErr.code + err.message = mockErr.code + ': ' + mockErr.description + ', ' + err.syscall + ' \'' + dir + '\'' + } + } + cb(err) + }) + }, + 'unlink': require('graceful-fs').unlink + } +}) + +// CONSTANTS +var TEMP_OPTIONS = { + unsafeCleanup: true, + mode: '0700' +} +var SHORT_PATH = path.join('i', 'am', 'a', 'path') +var PARTIAL_PATH = path.join(SHORT_PATH, 'that', 'ends', 'at', 'a') +var FULL_PATH = path.join(PARTIAL_PATH, 'file') + +var messages = [] +function log () { messages.push(Array.prototype.slice.call(arguments).join(' ')) } + +var testBase, partialPath, fullPath +test('xXx setup xXx', function (t) { + mkdtemp(TEMP_OPTIONS, function (er, tmpdir) { + t.ifError(er, 'temp directory exists') + + testBase = path.resolve(tmpdir, SHORT_PATH) + partialPath = path.resolve(tmpdir, PARTIAL_PATH) + fullPath = path.resolve(tmpdir, FULL_PATH) + + mkdirp(partialPath, function (er) { + t.ifError(er, 'made test path') + + writeFile(fullPath, new Buffer('hi'), function (er) { + t.ifError(er, 'made file') + + t.end() + }) + }) + }) +}) + +test('racy removal should quit gracefully', function (t) { + vacuum(fullPath, {purge: false, base: testBase, log: log}, function (er) { + t.ifError(er, 'cleaned up to base') + + t.equal(messages.length, 3, 'got 2 removal & 1 quit message') + t.equal(messages[2], 'quitting because new (racy) entries in ' + partialPath) + + var stat + var verifyPath = fullPath + + function verify () { stat = statSync(verifyPath) } + + // handle the file separately + t.throws(verify, verifyPath + ' cannot be statted') + t.notOk(stat && stat.isFile(), verifyPath + ' is totally gone') + verifyPath = path.dirname(verifyPath) + + for (var i = 0; i < 4; i++) { + t.doesNotThrow(function () { + stat = statSync(verifyPath) + }, verifyPath + ' can be statted') + t.ok(stat && stat.isDirectory(), verifyPath + ' is still a directory') + verifyPath = path.dirname(verifyPath) + } + + t.doesNotThrow(function () { + stat = statSync(testBase) + }, testBase + ' can be statted') + t.ok(stat && stat.isDirectory(), testBase + ' is still a directory') + + var files = readdirSync(testBase) + t.equal(files.length, 1, 'base directory untouched') + + t.end() + }) +}) diff --git a/node_modules/fs-vacuum/test/racy-entries.js b/node_modules/fs-vacuum/test/racy-entries.js new file mode 100644 index 000000000..c0ed53243 --- /dev/null +++ b/node_modules/fs-vacuum/test/racy-entries.js @@ -0,0 +1,104 @@ +var path = require('path') + +var test = require('tap').test + +var readdir = require('graceful-fs').readdir +var readdirSync = require('graceful-fs').readdirSync +var statSync = require('graceful-fs').statSync +var writeFile = require('graceful-fs').writeFile +var mkdirp = require('mkdirp') +var mkdtemp = require('tmp').dir +var tmpFile = require('tmp').file + +var requireInject = require('require-inject') +var vacuum = requireInject('../vacuum.js', { + 'graceful-fs': { + 'lstat': require('graceful-fs').lstat, + 'readdir': function (dir, cb) { + readdir(dir, function (err, files) { + // Simulate racy removal by creating a file after vacuum + // thinks the directory is empty + if (dir === partialPath && files.length === 0) { + tmpFile({dir: dir}, function (err, path, fd) { + if (err) throw err + cb(err, files) + }) + } else { + cb(err, files) + } + }) + }, + 'rmdir': require('graceful-fs').rmdir, + 'unlink': require('graceful-fs').unlink + } +}) + +// CONSTANTS +var TEMP_OPTIONS = { + unsafeCleanup: true, + mode: '0700' +} +var SHORT_PATH = path.join('i', 'am', 'a', 'path') +var PARTIAL_PATH = path.join(SHORT_PATH, 'that', 'ends', 'at', 'a') +var FULL_PATH = path.join(PARTIAL_PATH, 'file') + +var messages = [] +function log () { messages.push(Array.prototype.slice.call(arguments).join(' ')) } + +var testBase, partialPath, fullPath +test('xXx setup xXx', function (t) { + mkdtemp(TEMP_OPTIONS, function (er, tmpdir) { + t.ifError(er, 'temp directory exists') + + testBase = path.resolve(tmpdir, SHORT_PATH) + partialPath = path.resolve(tmpdir, PARTIAL_PATH) + fullPath = path.resolve(tmpdir, FULL_PATH) + + mkdirp(partialPath, function (er) { + t.ifError(er, 'made test path') + + writeFile(fullPath, new Buffer('hi'), function (er) { + t.ifError(er, 'made file') + + t.end() + }) + }) + }) +}) + +test('racy removal should quit gracefully', function (t) { + vacuum(fullPath, {purge: false, base: testBase, log: log}, function (er) { + t.ifError(er, 'cleaned up to base') + + t.equal(messages.length, 3, 'got 2 removal & 1 quit message') + t.equal(messages[2], 'quitting because new (racy) entries in ' + partialPath) + + var stat + var verifyPath = fullPath + + function verify () { stat = statSync(verifyPath) } + + // handle the file separately + t.throws(verify, verifyPath + ' cannot be statted') + t.notOk(stat && stat.isFile(), verifyPath + ' is totally gone') + verifyPath = path.dirname(verifyPath) + + for (var i = 0; i < 4; i++) { + t.doesNotThrow(function () { + stat = statSync(verifyPath) + }, verifyPath + ' can be statted') + t.ok(stat && stat.isDirectory(), verifyPath + ' is still a directory') + verifyPath = path.dirname(verifyPath) + } + + t.doesNotThrow(function () { + stat = statSync(testBase) + }, testBase + ' can be statted') + t.ok(stat && stat.isDirectory(), testBase + ' is still a directory') + + var files = readdirSync(testBase) + t.equal(files.length, 1, 'base directory untouched') + + t.end() + }) +}) diff --git a/node_modules/fs-vacuum/vacuum.js b/node_modules/fs-vacuum/vacuum.js index e55abe970..1fb674da9 100644 --- a/node_modules/fs-vacuum/vacuum.js +++ b/node_modules/fs-vacuum/vacuum.js @@ -1,108 +1,106 @@ -var assert = require("assert") -var dirname = require("path").dirname -var resolve = require("path").resolve -var isInside = require("path-is-inside") +var assert = require('assert') +var dirname = require('path').dirname +var resolve = require('path').resolve +var isInside = require('path-is-inside') -var rimraf = require("rimraf") -var lstat = require("graceful-fs").lstat -var readdir = require("graceful-fs").readdir -var rmdir = require("graceful-fs").rmdir -var unlink = require("graceful-fs").unlink +var rimraf = require('rimraf') +var lstat = require('graceful-fs').lstat +var readdir = require('graceful-fs').readdir +var rmdir = require('graceful-fs').rmdir +var unlink = require('graceful-fs').unlink module.exports = vacuum -function vacuum(leaf, options, cb) { - assert(typeof leaf === "string", "must pass in path to remove") - assert(typeof cb === "function", "must pass in callback") +function vacuum (leaf, options, cb) { + assert(typeof leaf === 'string', 'must pass in path to remove') + assert(typeof cb === 'function', 'must pass in callback') if (!options) options = {} - assert(typeof options === "object", "options must be an object") + assert(typeof options === 'object', 'options must be an object') var log = options.log ? options.log : function () {} leaf = leaf && resolve(leaf) var base = options.base && resolve(options.base) if (base && !isInside(leaf, base)) { - return cb(new Error(leaf + " is not a child of " + base)) + return cb(new Error(leaf + ' is not a child of ' + base)) } lstat(leaf, function (error, stat) { if (error) { - if (error.code === "ENOENT") return cb(null) + if (error.code === 'ENOENT') return cb(null) log(error.stack) return cb(error) } if (!(stat && (stat.isDirectory() || stat.isSymbolicLink() || stat.isFile()))) { - log(leaf, "is not a directory, file, or link") - return cb(new Error(leaf + " is not a directory, file, or link")) + log(leaf, 'is not a directory, file, or link') + return cb(new Error(leaf + ' is not a directory, file, or link')) } if (options.purge) { - log("purging", leaf) + log('purging', leaf) rimraf(leaf, function (error) { if (error) return cb(error) next(dirname(leaf)) }) - } - else if (!stat.isDirectory()) { - log("removing", leaf) + } else if (!stat.isDirectory()) { + log('removing', leaf) unlink(leaf, function (error) { if (error) return cb(error) next(dirname(leaf)) }) - } - else { + } else { next(leaf) } }) - function next(branch) { + function next (branch) { branch = branch && resolve(branch) // either we've reached the base or we've reached the root if ((base && branch === base) || branch === dirname(branch)) { - log("finished vacuuming up to", branch) + log('finished vacuuming up to', branch) return cb(null) } readdir(branch, function (error, files) { if (error) { - if (error.code === "ENOENT") return cb(null) + if (error.code === 'ENOENT') return cb(null) - log("unable to check directory", branch, "due to", error.message) + log('unable to check directory', branch, 'due to', error.message) return cb(error) } if (files.length > 0) { - log("quitting because other entries in", branch) + log('quitting because other entries in', branch) return cb(null) } - log("removing", branch) + log('removing', branch) lstat(branch, function (error, stat) { if (error) { - if (error.code === "ENOENT") return cb(null) + if (error.code === 'ENOENT') return cb(null) - log("unable to lstat", branch, "due to", error.message) + log('unable to lstat', branch, 'due to', error.message) return cb(error) } var remove = stat.isDirectory() ? rmdir : unlink remove(branch, function (error) { if (error) { - if (error.code === "ENOENT") { - log("quitting because lost the race to remove", branch) + if (error.code === 'ENOENT') { + log('quitting because lost the race to remove', branch) return cb(null) } - if (error.code === "ENOTEMPTY") { - log("quitting because new (racy) entries in", branch) + if (error.code === 'ENOTEMPTY' || error.code === 'EEXIST') { + log('quitting because new (racy) entries in', branch) return cb(null) } - log("unable to remove", branch, "due to", error.message) + log('unable to remove', branch, 'due to', error.message) return cb(error) } |