Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/npm/cli.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRebecca Turner <me@re-becca.org>2016-04-21 10:26:10 +0300
committerRebecca Turner <me@re-becca.org>2016-04-22 02:35:07 +0300
commitadc515b22775871386cd62390079fb4bf8e1714a (patch)
treeddbc611be1c6b85dc1fd640a307ba0816e58de5a /node_modules
parentef53a46906ce872a4541b605dd42a563cc26e614 (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.yml14
-rw-r--r--node_modules/fs-vacuum/package.json115
-rw-r--r--node_modules/fs-vacuum/test/arguments.js18
-rw-r--r--node_modules/fs-vacuum/test/base-leaf-mismatch.js14
-rw-r--r--node_modules/fs-vacuum/test/no-entries-file-no-purge.js68
-rw-r--r--node_modules/fs-vacuum/test/no-entries-link-no-purge.js70
-rw-r--r--node_modules/fs-vacuum/test/no-entries-no-purge.js48
-rw-r--r--node_modules/fs-vacuum/test/no-entries-with-link-purge.js72
-rw-r--r--node_modules/fs-vacuum/test/no-entries-with-purge.js62
-rw-r--r--node_modules/fs-vacuum/test/other-directories-no-purge.js64
-rw-r--r--node_modules/fs-vacuum/test/racy-entries-eexist.js119
-rw-r--r--node_modules/fs-vacuum/test/racy-entries-enotempty.js119
-rw-r--r--node_modules/fs-vacuum/test/racy-entries.js104
-rw-r--r--node_modules/fs-vacuum/vacuum.js70
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)
}