08-27-周三_17-09-29
This commit is contained in:
7
node_modules/graceful-fs/.travis.yml
generated
vendored
Normal file
7
node_modules/graceful-fs/.travis.yml
generated
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
sudo: false
|
||||
language: node_js
|
||||
node_js:
|
||||
- '0.10'
|
||||
- '0.12'
|
||||
- '4'
|
||||
- '6'
|
51
node_modules/graceful-fs/4374b79.diff
generated
vendored
Normal file
51
node_modules/graceful-fs/4374b79.diff
generated
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
commit 4374b79aed648738d2458ce027cbe2b372bf7b3a
|
||||
Author: isaacs <i@izs.me>
|
||||
Date: Wed Jun 26 12:12:17 2019 -0700
|
||||
|
||||
Add support for stat options
|
||||
|
||||
Fix #158
|
||||
|
||||
diff --git a/polyfills.js b/polyfills.js
|
||||
index b964ed0..bc9759b 100644
|
||||
--- a/polyfills.js
|
||||
+++ b/polyfills.js
|
||||
@@ -273,17 +273,23 @@ function patch (fs) {
|
||||
}
|
||||
|
||||
|
||||
+ // stat options added in v10.5.0
|
||||
+ var supportsStatOptions = /^v[1-9][1-9]|^v10\.[5-9]/.test(process.version)
|
||||
function statFix (orig) {
|
||||
if (!orig) return orig
|
||||
// Older versions of Node erroneously returned signed integers for
|
||||
// uid + gid.
|
||||
- return function (target, cb) {
|
||||
- return orig.call(fs, target, function (er, stats) {
|
||||
- if (!stats) return cb.apply(this, arguments)
|
||||
+ return function (target, options, cb) {
|
||||
+ if (typeof options === 'function')
|
||||
+ cb = options, options = null
|
||||
+ function callback (er, stats) {
|
||||
+ if (!stats) return cb && cb.apply(this, arguments)
|
||||
if (stats.uid < 0) stats.uid += 0x100000000
|
||||
if (stats.gid < 0) stats.gid += 0x100000000
|
||||
if (cb) cb.apply(this, arguments)
|
||||
- })
|
||||
+ }
|
||||
+ return supportsStatOptions ? orig.call(fs, target, options || {}, callback)
|
||||
+ : orig.call(fs, target, callback)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -291,8 +297,8 @@ function patch (fs) {
|
||||
if (!orig) return orig
|
||||
// Older versions of Node erroneously returned signed integers for
|
||||
// uid + gid.
|
||||
- return function (target) {
|
||||
- var stats = orig.call(fs, target)
|
||||
+ return function (target, options) {
|
||||
+ var stats = orig.call(fs, target, options)
|
||||
if (stats.uid < 0) stats.uid += 0x100000000
|
||||
if (stats.gid < 0) stats.gid += 0x100000000
|
||||
return stats;
|
15
node_modules/graceful-fs/LICENSE
generated
vendored
Normal file
15
node_modules/graceful-fs/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
The ISC License
|
||||
|
||||
Copyright (c) Isaac Z. Schlueter and Contributors
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for any
|
||||
purpose with or without fee is hereby granted, provided that the above
|
||||
copyright notice and this permission notice appear in all copies.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
|
||||
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
36
node_modules/graceful-fs/README.md
generated
vendored
Normal file
36
node_modules/graceful-fs/README.md
generated
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
# graceful-fs
|
||||
|
||||
graceful-fs functions as a drop-in replacement for the fs module,
|
||||
making various improvements.
|
||||
|
||||
The improvements are meant to normalize behavior across different
|
||||
platforms and environments, and to make filesystem access more
|
||||
resilient to errors.
|
||||
|
||||
## Improvements over [fs module](http://api.nodejs.org/fs.html)
|
||||
|
||||
graceful-fs:
|
||||
|
||||
* Queues up `open` and `readdir` calls, and retries them once
|
||||
something closes if there is an EMFILE error from too many file
|
||||
descriptors.
|
||||
* fixes `lchmod` for Node versions prior to 0.6.2.
|
||||
* implements `fs.lutimes` if possible. Otherwise it becomes a noop.
|
||||
* ignores `EINVAL` and `EPERM` errors in `chown`, `fchown` or
|
||||
`lchown` if the user isn't root.
|
||||
* makes `lchmod` and `lchown` become noops, if not available.
|
||||
* retries reading a file if `read` results in EAGAIN error.
|
||||
|
||||
On Windows, it retries renaming a file for up to one second if `EACCESS`
|
||||
or `EPERM` error occurs, likely because antivirus software has locked
|
||||
the directory.
|
||||
|
||||
## USAGE
|
||||
|
||||
```javascript
|
||||
// use just like fs
|
||||
var fs = require('graceful-fs')
|
||||
|
||||
// now go and do stuff with it...
|
||||
fs.readFileSync('some-file-or-whatever')
|
||||
```
|
5
node_modules/graceful-fs/foo.sh
generated
vendored
Normal file
5
node_modules/graceful-fs/foo.sh
generated
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
#!/bin/bash
|
||||
|
||||
# set -e
|
||||
false
|
||||
echo 'ok'
|
1
node_modules/graceful-fs/fs.js
generated
vendored
Normal file
1
node_modules/graceful-fs/fs.js
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
module.exports = require('natives').require('fs', ['stream'])
|
158
node_modules/graceful-fs/graceful-fs.js
generated
vendored
Normal file
158
node_modules/graceful-fs/graceful-fs.js
generated
vendored
Normal file
@@ -0,0 +1,158 @@
|
||||
// Monkey-patching the fs module.
|
||||
// It's ugly, but there is simply no other way to do this.
|
||||
var fs = module.exports = require('./fs.js')
|
||||
|
||||
var assert = require('assert')
|
||||
|
||||
// fix up some busted stuff, mostly on windows and old nodes
|
||||
require('./polyfills.js')
|
||||
|
||||
var util = require('util')
|
||||
|
||||
function noop () {}
|
||||
|
||||
var debug = noop
|
||||
if (util.debuglog)
|
||||
debug = util.debuglog('gfs')
|
||||
else if (/\bgfs\b/i.test(process.env.NODE_DEBUG || ''))
|
||||
debug = function() {
|
||||
var m = util.format.apply(util, arguments)
|
||||
m = 'GFS: ' + m.split(/\n/).join('\nGFS: ')
|
||||
console.error(m)
|
||||
}
|
||||
|
||||
if (/\bgfs\b/i.test(process.env.NODE_DEBUG || '')) {
|
||||
process.on('exit', function() {
|
||||
debug('fds', fds)
|
||||
debug(queue)
|
||||
assert.equal(queue.length, 0)
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
var originalOpen = fs.open
|
||||
fs.open = open
|
||||
|
||||
function open(path, flags, mode, cb) {
|
||||
if (typeof mode === "function") cb = mode, mode = null
|
||||
if (typeof cb !== "function") cb = noop
|
||||
new OpenReq(path, flags, mode, cb)
|
||||
}
|
||||
|
||||
function OpenReq(path, flags, mode, cb) {
|
||||
this.path = path
|
||||
this.flags = flags
|
||||
this.mode = mode
|
||||
this.cb = cb
|
||||
Req.call(this)
|
||||
}
|
||||
|
||||
util.inherits(OpenReq, Req)
|
||||
|
||||
OpenReq.prototype.process = function() {
|
||||
originalOpen.call(fs, this.path, this.flags, this.mode, this.done)
|
||||
}
|
||||
|
||||
var fds = {}
|
||||
OpenReq.prototype.done = function(er, fd) {
|
||||
debug('open done', er, fd)
|
||||
if (fd)
|
||||
fds['fd' + fd] = this.path
|
||||
Req.prototype.done.call(this, er, fd)
|
||||
}
|
||||
|
||||
|
||||
var originalReaddir = fs.readdir
|
||||
fs.readdir = readdir
|
||||
|
||||
function readdir(path, cb) {
|
||||
if (typeof cb !== "function") cb = noop
|
||||
new ReaddirReq(path, cb)
|
||||
}
|
||||
|
||||
function ReaddirReq(path, cb) {
|
||||
this.path = path
|
||||
this.cb = cb
|
||||
Req.call(this)
|
||||
}
|
||||
|
||||
util.inherits(ReaddirReq, Req)
|
||||
|
||||
ReaddirReq.prototype.process = function() {
|
||||
originalReaddir.call(fs, this.path, this.done)
|
||||
}
|
||||
|
||||
ReaddirReq.prototype.done = function(er, files) {
|
||||
if (files && files.sort)
|
||||
files = files.sort()
|
||||
Req.prototype.done.call(this, er, files)
|
||||
onclose()
|
||||
}
|
||||
|
||||
|
||||
var originalClose = fs.close
|
||||
fs.close = close
|
||||
|
||||
function close (fd, cb) {
|
||||
debug('close', fd)
|
||||
if (typeof cb !== "function") cb = noop
|
||||
delete fds['fd' + fd]
|
||||
originalClose.call(fs, fd, function(er) {
|
||||
onclose()
|
||||
cb(er)
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
var originalCloseSync = fs.closeSync
|
||||
fs.closeSync = closeSync
|
||||
|
||||
function closeSync (fd) {
|
||||
try {
|
||||
return originalCloseSync(fd)
|
||||
} finally {
|
||||
onclose()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Req class
|
||||
function Req () {
|
||||
// start processing
|
||||
this.done = this.done.bind(this)
|
||||
this.failures = 0
|
||||
this.process()
|
||||
}
|
||||
|
||||
Req.prototype.done = function (er, result) {
|
||||
var tryAgain = false
|
||||
if (er) {
|
||||
var code = er.code
|
||||
var tryAgain = code === "EMFILE" || code === "ENFILE"
|
||||
if (process.platform === "win32")
|
||||
tryAgain = tryAgain || code === "OK"
|
||||
}
|
||||
|
||||
if (tryAgain) {
|
||||
this.failures ++
|
||||
enqueue(this)
|
||||
} else {
|
||||
var cb = this.cb
|
||||
cb(er, result)
|
||||
}
|
||||
}
|
||||
|
||||
var queue = []
|
||||
|
||||
function enqueue(req) {
|
||||
queue.push(req)
|
||||
debug('enqueue %d %s', queue.length, req.constructor.name, req)
|
||||
}
|
||||
|
||||
function onclose() {
|
||||
var req = queue.shift()
|
||||
if (req) {
|
||||
debug('process', req.constructor.name, req)
|
||||
req.process()
|
||||
}
|
||||
}
|
0
node_modules/graceful-fs/heap.txt
generated
vendored
Normal file
0
node_modules/graceful-fs/heap.txt
generated
vendored
Normal file
120
node_modules/graceful-fs/package.json
generated
vendored
Normal file
120
node_modules/graceful-fs/package.json
generated
vendored
Normal file
@@ -0,0 +1,120 @@
|
||||
{
|
||||
"_args": [
|
||||
[
|
||||
{
|
||||
"name": "graceful-fs",
|
||||
"raw": "graceful-fs@^3.0.5",
|
||||
"rawSpec": "^3.0.5",
|
||||
"scope": null,
|
||||
"spec": ">=3.0.5 <4.0.0",
|
||||
"type": "range"
|
||||
},
|
||||
"F:\\tmp\\gitbook\\node_modules\\less"
|
||||
]
|
||||
],
|
||||
"_from": "graceful-fs@>=3.0.5 <4.0.0",
|
||||
"_hasShrinkwrap": false,
|
||||
"_id": "graceful-fs@3.0.12",
|
||||
"_inCache": true,
|
||||
"_installable": true,
|
||||
"_location": "/graceful-fs",
|
||||
"_nodeVersion": "12.6.0",
|
||||
"_npmOperationalInternal": {
|
||||
"host": "s3://npm-registry-packages",
|
||||
"tmp": "tmp/graceful-fs_3.0.12_1565740649533_0.36498180242185585"
|
||||
},
|
||||
"_npmUser": {
|
||||
"email": "i@izs.me",
|
||||
"name": "isaacs"
|
||||
},
|
||||
"_npmVersion": "6.10.3",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"name": "graceful-fs",
|
||||
"raw": "graceful-fs@^3.0.5",
|
||||
"rawSpec": "^3.0.5",
|
||||
"scope": null,
|
||||
"spec": ">=3.0.5 <4.0.0",
|
||||
"type": "range"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/less"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.12.tgz",
|
||||
"_shasum": "0034947ce9ed695ec8ab0b854bc919e82b1ffaef",
|
||||
"_shrinkwrap": null,
|
||||
"_spec": "graceful-fs@^3.0.5",
|
||||
"_where": "F:\\tmp\\gitbook\\node_modules\\less",
|
||||
"author": {
|
||||
"email": "i@izs.me",
|
||||
"name": "Isaac Z. Schlueter",
|
||||
"url": "http://blog.izs.me"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/isaacs/node-graceful-fs/issues"
|
||||
},
|
||||
"dependencies": {
|
||||
"natives": "^1.1.3"
|
||||
},
|
||||
"description": "A drop-in replacement for fs, making various improvements.",
|
||||
"devDependencies": {
|
||||
"mkdirp": "^0.5.0",
|
||||
"rimraf": "^2.2.8",
|
||||
"tap": "^1.2.0"
|
||||
},
|
||||
"directories": {
|
||||
"test": "test"
|
||||
},
|
||||
"dist": {
|
||||
"fileCount": 14,
|
||||
"integrity": "sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg==",
|
||||
"npm-signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdU05qCRA9TVsSAnZWagAAU+8P/12SxA6n34xKCxYHHP6q\n2zpDXyYFU13j9pT6m+JwUy9pSdaQNsbuutjNi6R+f1QfRuiQeGxYQ0YHQU6u\nBinT0V+vlOP5H5TnGwpbSdP0S7Y43c3xm8ox6MHJKm0SF67zbAPDelQUZJwR\nvQsk4X5XN2VTqHlPMuK7LTp2AaWZMyTBLiGFA9KOLyYBuF9oBoTPQCZ0S+in\nV3Kjmto+kqj/pYdYHjFq7yYC6o9IfraJWrnQ1p7VhP6goh2dTNOraKBF9HcO\n3eRT7fohaNnV8pghzy/LPKVLSXtoq/n2Yh9YpfHIxO4uvMr2ylqXYzg/66+b\nunpr71QLoON3Qp+e3pk6oLbuBY/i1w2V+P7I0Wc83kRYEszwkSttLd/gwCS5\ngN7tL2tWMDa61oWODIwtrpRnUtGCmTdCCRXoRJEZily8s6rpz6kR96QEDxBj\nG8Fy83GkO7LY6pXjyow2mHEIlHpIJqjd56MHulu6hjYK4M2sBzYAcnMXxZFB\nAZ/lMrLCKrA1F2UY+cxPD+sw4UDem2iRBPQQEJLNIFqT2n+i1PJVdd8HBYCm\nstX4mfoncmYmO3VSZwhGAdwEA5QDPxkTc5Zr3gF49nhVBWr8NmjyjKgogzt9\n3aXk32jSeMbG/Vh/aG2+UUJ1a+NmEb0OMnyw4flrNGLa/f4gVtiIRAnNsGqc\nFS90\r\n=L0V+\r\n-----END PGP SIGNATURE-----\r\n",
|
||||
"shasum": "0034947ce9ed695ec8ab0b854bc919e82b1ffaef",
|
||||
"tarball": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.12.tgz",
|
||||
"unpackedSize": 17948
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.4.0"
|
||||
},
|
||||
"gitHead": "cbfb4864a3a312ba3d605ba187e8c920df1128d7",
|
||||
"homepage": "https://github.com/isaacs/node-graceful-fs#readme",
|
||||
"keywords": [
|
||||
"fs",
|
||||
"module",
|
||||
"reading",
|
||||
"retry",
|
||||
"retries",
|
||||
"queue",
|
||||
"error",
|
||||
"errors",
|
||||
"handling",
|
||||
"EMFILE",
|
||||
"EAGAIN",
|
||||
"EINVAL",
|
||||
"EPERM",
|
||||
"EACCESS"
|
||||
],
|
||||
"license": "ISC",
|
||||
"main": "graceful-fs.js",
|
||||
"maintainers": [
|
||||
{
|
||||
"email": "i@izs.me",
|
||||
"name": "isaacs"
|
||||
}
|
||||
],
|
||||
"name": "graceful-fs",
|
||||
"optionalDependencies": {},
|
||||
"publishConfig": {
|
||||
"tag": "old"
|
||||
},
|
||||
"readme": "# graceful-fs\n\ngraceful-fs functions as a drop-in replacement for the fs module,\nmaking various improvements.\n\nThe improvements are meant to normalize behavior across different\nplatforms and environments, and to make filesystem access more\nresilient to errors.\n\n## Improvements over [fs module](http://api.nodejs.org/fs.html)\n\ngraceful-fs:\n\n* Queues up `open` and `readdir` calls, and retries them once\n something closes if there is an EMFILE error from too many file\n descriptors.\n* fixes `lchmod` for Node versions prior to 0.6.2.\n* implements `fs.lutimes` if possible. Otherwise it becomes a noop.\n* ignores `EINVAL` and `EPERM` errors in `chown`, `fchown` or\n `lchown` if the user isn't root.\n* makes `lchmod` and `lchown` become noops, if not available.\n* retries reading a file if `read` results in EAGAIN error.\n\nOn Windows, it retries renaming a file for up to one second if `EACCESS`\nor `EPERM` error occurs, likely because antivirus software has locked\nthe directory.\n\n## USAGE\n\n```javascript\n// use just like fs\nvar fs = require('graceful-fs')\n\n// now go and do stuff with it...\nfs.readFileSync('some-file-or-whatever')\n```\n",
|
||||
"readmeFilename": "README.md",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/isaacs/node-graceful-fs.git"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "tap test/*.js"
|
||||
},
|
||||
"version": "3.0.12"
|
||||
}
|
255
node_modules/graceful-fs/polyfills.js
generated
vendored
Normal file
255
node_modules/graceful-fs/polyfills.js
generated
vendored
Normal file
@@ -0,0 +1,255 @@
|
||||
var fs = require('./fs.js')
|
||||
var constants = require('constants')
|
||||
|
||||
var origCwd = process.cwd
|
||||
var cwd = null
|
||||
process.cwd = function() {
|
||||
if (!cwd)
|
||||
cwd = origCwd.call(process)
|
||||
return cwd
|
||||
}
|
||||
var chdir = process.chdir
|
||||
process.chdir = function(d) {
|
||||
cwd = null
|
||||
chdir.call(process, d)
|
||||
}
|
||||
|
||||
// (re-)implement some things that are known busted or missing.
|
||||
|
||||
// lchmod, broken prior to 0.6.2
|
||||
// back-port the fix here.
|
||||
if (constants.hasOwnProperty('O_SYMLINK') &&
|
||||
process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) {
|
||||
fs.lchmod = function (path, mode, callback) {
|
||||
callback = callback || noop
|
||||
fs.open( path
|
||||
, constants.O_WRONLY | constants.O_SYMLINK
|
||||
, mode
|
||||
, function (err, fd) {
|
||||
if (err) {
|
||||
callback(err)
|
||||
return
|
||||
}
|
||||
// prefer to return the chmod error, if one occurs,
|
||||
// but still try to close, and report closing errors if they occur.
|
||||
fs.fchmod(fd, mode, function (err) {
|
||||
fs.close(fd, function(err2) {
|
||||
callback(err || err2)
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
fs.lchmodSync = function (path, mode) {
|
||||
var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode)
|
||||
|
||||
// prefer to return the chmod error, if one occurs,
|
||||
// but still try to close, and report closing errors if they occur.
|
||||
var err, err2
|
||||
try {
|
||||
var ret = fs.fchmodSync(fd, mode)
|
||||
} catch (er) {
|
||||
err = er
|
||||
}
|
||||
try {
|
||||
fs.closeSync(fd)
|
||||
} catch (er) {
|
||||
err2 = er
|
||||
}
|
||||
if (err || err2) throw (err || err2)
|
||||
return ret
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// lutimes implementation, or no-op
|
||||
if (!fs.lutimes) {
|
||||
if (constants.hasOwnProperty("O_SYMLINK")) {
|
||||
fs.lutimes = function (path, at, mt, cb) {
|
||||
fs.open(path, constants.O_SYMLINK, function (er, fd) {
|
||||
cb = cb || noop
|
||||
if (er) return cb(er)
|
||||
fs.futimes(fd, at, mt, function (er) {
|
||||
fs.close(fd, function (er2) {
|
||||
return cb(er || er2)
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
fs.lutimesSync = function (path, at, mt) {
|
||||
var fd = fs.openSync(path, constants.O_SYMLINK)
|
||||
, err
|
||||
, err2
|
||||
, ret
|
||||
|
||||
try {
|
||||
var ret = fs.futimesSync(fd, at, mt)
|
||||
} catch (er) {
|
||||
err = er
|
||||
}
|
||||
try {
|
||||
fs.closeSync(fd)
|
||||
} catch (er) {
|
||||
err2 = er
|
||||
}
|
||||
if (err || err2) throw (err || err2)
|
||||
return ret
|
||||
}
|
||||
|
||||
} else if (fs.utimensat && constants.hasOwnProperty("AT_SYMLINK_NOFOLLOW")) {
|
||||
// maybe utimensat will be bound soonish?
|
||||
fs.lutimes = function (path, at, mt, cb) {
|
||||
fs.utimensat(path, at, mt, constants.AT_SYMLINK_NOFOLLOW, cb)
|
||||
}
|
||||
|
||||
fs.lutimesSync = function (path, at, mt) {
|
||||
return fs.utimensatSync(path, at, mt, constants.AT_SYMLINK_NOFOLLOW)
|
||||
}
|
||||
|
||||
} else {
|
||||
fs.lutimes = function (_a, _b, _c, cb) { process.nextTick(cb) }
|
||||
fs.lutimesSync = function () {}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// https://github.com/isaacs/node-graceful-fs/issues/4
|
||||
// Chown should not fail on einval or eperm if non-root.
|
||||
// It should not fail on enosys ever, as this just indicates
|
||||
// that a fs doesn't support the intended operation.
|
||||
|
||||
fs.chown = chownFix(fs.chown)
|
||||
fs.fchown = chownFix(fs.fchown)
|
||||
fs.lchown = chownFix(fs.lchown)
|
||||
|
||||
fs.chmod = chownFix(fs.chmod)
|
||||
fs.fchmod = chownFix(fs.fchmod)
|
||||
fs.lchmod = chownFix(fs.lchmod)
|
||||
|
||||
fs.chownSync = chownFixSync(fs.chownSync)
|
||||
fs.fchownSync = chownFixSync(fs.fchownSync)
|
||||
fs.lchownSync = chownFixSync(fs.lchownSync)
|
||||
|
||||
fs.chmodSync = chownFix(fs.chmodSync)
|
||||
fs.fchmodSync = chownFix(fs.fchmodSync)
|
||||
fs.lchmodSync = chownFix(fs.lchmodSync)
|
||||
|
||||
function chownFix (orig) {
|
||||
if (!orig) return orig
|
||||
return function (target, uid, gid, cb) {
|
||||
return orig.call(fs, target, uid, gid, function (er, res) {
|
||||
if (chownErOk(er)) er = null
|
||||
cb(er, res)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
function chownFixSync (orig) {
|
||||
if (!orig) return orig
|
||||
return function (target, uid, gid) {
|
||||
try {
|
||||
return orig.call(fs, target, uid, gid)
|
||||
} catch (er) {
|
||||
if (!chownErOk(er)) throw er
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ENOSYS means that the fs doesn't support the op. Just ignore
|
||||
// that, because it doesn't matter.
|
||||
//
|
||||
// if there's no getuid, or if getuid() is something other
|
||||
// than 0, and the error is EINVAL or EPERM, then just ignore
|
||||
// it.
|
||||
//
|
||||
// This specific case is a silent failure in cp, install, tar,
|
||||
// and most other unix tools that manage permissions.
|
||||
//
|
||||
// When running as root, or if other types of errors are
|
||||
// encountered, then it's strict.
|
||||
function chownErOk (er) {
|
||||
if (!er)
|
||||
return true
|
||||
|
||||
if (er.code === "ENOSYS")
|
||||
return true
|
||||
|
||||
var nonroot = !process.getuid || process.getuid() !== 0
|
||||
if (nonroot) {
|
||||
if (er.code === "EINVAL" || er.code === "EPERM")
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
|
||||
// if lchmod/lchown do not exist, then make them no-ops
|
||||
if (!fs.lchmod) {
|
||||
fs.lchmod = function (path, mode, cb) {
|
||||
process.nextTick(cb)
|
||||
}
|
||||
fs.lchmodSync = function () {}
|
||||
}
|
||||
if (!fs.lchown) {
|
||||
fs.lchown = function (path, uid, gid, cb) {
|
||||
process.nextTick(cb)
|
||||
}
|
||||
fs.lchownSync = function () {}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// on Windows, A/V software can lock the directory, causing this
|
||||
// to fail with an EACCES or EPERM if the directory contains newly
|
||||
// created files. Try again on failure, for up to 1 second.
|
||||
if (process.platform === "win32") {
|
||||
var rename_ = fs.rename
|
||||
fs.rename = function rename (from, to, cb) {
|
||||
var start = Date.now()
|
||||
rename_(from, to, function CB (er) {
|
||||
if (er
|
||||
&& (er.code === "EACCES" || er.code === "EPERM")
|
||||
&& Date.now() - start < 1000) {
|
||||
return rename_(from, to, CB)
|
||||
}
|
||||
if(cb) cb(er)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// if read() returns EAGAIN, then just try it again.
|
||||
var read = fs.read
|
||||
fs.read = function (fd, buffer, offset, length, position, callback_) {
|
||||
var callback
|
||||
if (callback_ && typeof callback_ === 'function') {
|
||||
var eagCounter = 0
|
||||
callback = function (er, _, __) {
|
||||
if (er && er.code === 'EAGAIN' && eagCounter < 10) {
|
||||
eagCounter ++
|
||||
return read.call(fs, fd, buffer, offset, length, position, callback)
|
||||
}
|
||||
callback_.apply(this, arguments)
|
||||
}
|
||||
}
|
||||
return read.call(fs, fd, buffer, offset, length, position, callback)
|
||||
}
|
||||
|
||||
var readSync = fs.readSync
|
||||
fs.readSync = function (fd, buffer, offset, length, position) {
|
||||
var eagCounter = 0
|
||||
while (true) {
|
||||
try {
|
||||
return readSync.call(fs, fd, buffer, offset, length, position)
|
||||
} catch (er) {
|
||||
if (er.code === 'EAGAIN' && eagCounter < 10) {
|
||||
eagCounter ++
|
||||
continue
|
||||
}
|
||||
throw er
|
||||
}
|
||||
}
|
||||
}
|
||||
|
69
node_modules/graceful-fs/test/max-open.js
generated
vendored
Normal file
69
node_modules/graceful-fs/test/max-open.js
generated
vendored
Normal file
@@ -0,0 +1,69 @@
|
||||
var test = require('tap').test
|
||||
var fs = require('../')
|
||||
|
||||
test('open lots of stuff', function (t) {
|
||||
// Get around EBADF from libuv by making sure that stderr is opened
|
||||
// Otherwise Darwin will refuse to give us a FD for stderr!
|
||||
process.stderr.write('')
|
||||
|
||||
// How many parallel open()'s to do
|
||||
var n = 1024
|
||||
var opens = 0
|
||||
var fds = []
|
||||
var going = true
|
||||
var closing = false
|
||||
var doneCalled = 0
|
||||
|
||||
for (var i = 0; i < n; i++) {
|
||||
go()
|
||||
}
|
||||
|
||||
function go() {
|
||||
opens++
|
||||
fs.open(__filename, 'r', function (er, fd) {
|
||||
if (er) throw er
|
||||
fds.push(fd)
|
||||
if (going) go()
|
||||
})
|
||||
}
|
||||
|
||||
// should hit ulimit pretty fast
|
||||
setTimeout(function () {
|
||||
going = false
|
||||
t.equal(opens - fds.length, n)
|
||||
done()
|
||||
}, 100)
|
||||
|
||||
|
||||
function done () {
|
||||
if (closing) return
|
||||
doneCalled++
|
||||
|
||||
if (fds.length === 0) {
|
||||
console.error('done called %d times', doneCalled)
|
||||
// First because of the timeout
|
||||
// Then to close the fd's opened afterwards
|
||||
// Then this time, to complete.
|
||||
// Might take multiple passes, depending on CPU speed
|
||||
// and ulimit, but at least 3 in every case.
|
||||
t.ok(doneCalled >= 2)
|
||||
return t.end()
|
||||
}
|
||||
|
||||
closing = true
|
||||
setTimeout(function () {
|
||||
// console.error('do closing again')
|
||||
closing = false
|
||||
done()
|
||||
}, 100)
|
||||
|
||||
// console.error('closing time')
|
||||
var closes = fds.slice(0)
|
||||
fds.length = 0
|
||||
closes.forEach(function (fd) {
|
||||
fs.close(fd, function (er) {
|
||||
if (er) throw er
|
||||
})
|
||||
})
|
||||
}
|
||||
})
|
39
node_modules/graceful-fs/test/open.js
generated
vendored
Normal file
39
node_modules/graceful-fs/test/open.js
generated
vendored
Normal file
@@ -0,0 +1,39 @@
|
||||
var test = require('tap').test
|
||||
var fs = require('../graceful-fs.js')
|
||||
|
||||
test('graceful fs is monkeypatched fs', function (t) {
|
||||
t.equal(fs, require('../fs.js'))
|
||||
t.end()
|
||||
})
|
||||
|
||||
test('open an existing file works', function (t) {
|
||||
var fd = fs.openSync(__filename, 'r')
|
||||
fs.closeSync(fd)
|
||||
fs.open(__filename, 'r', function (er, fd) {
|
||||
if (er) throw er
|
||||
fs.close(fd, function (er) {
|
||||
if (er) throw er
|
||||
t.pass('works')
|
||||
t.end()
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
test('open a non-existing file throws', function (t) {
|
||||
var er
|
||||
try {
|
||||
var fd = fs.openSync('this file does not exist', 'r')
|
||||
} catch (x) {
|
||||
er = x
|
||||
}
|
||||
t.ok(er, 'should throw')
|
||||
t.notOk(fd, 'should not get an fd')
|
||||
t.equal(er.code, 'ENOENT')
|
||||
|
||||
fs.open('neither does this file', 'r', function (er, fd) {
|
||||
t.ok(er, 'should throw')
|
||||
t.notOk(fd, 'should not get an fd')
|
||||
t.equal(er.code, 'ENOENT')
|
||||
t.end()
|
||||
})
|
||||
})
|
20
node_modules/graceful-fs/test/readdir-sort.js
generated
vendored
Normal file
20
node_modules/graceful-fs/test/readdir-sort.js
generated
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
var test = require("tap").test
|
||||
var fs = require("../fs.js")
|
||||
|
||||
var readdir = fs.readdir
|
||||
fs.readdir = function(path, cb) {
|
||||
process.nextTick(function() {
|
||||
cb(null, ["b", "z", "a"])
|
||||
})
|
||||
}
|
||||
|
||||
var g = require("../")
|
||||
|
||||
test("readdir reorder", function (t) {
|
||||
g.readdir("whatevers", function (er, files) {
|
||||
if (er)
|
||||
throw er
|
||||
t.same(files, [ "a", "b", "z" ])
|
||||
t.end()
|
||||
})
|
||||
})
|
47
node_modules/graceful-fs/test/write-then-read.js
generated
vendored
Normal file
47
node_modules/graceful-fs/test/write-then-read.js
generated
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
var fs = require('../');
|
||||
var rimraf = require('rimraf');
|
||||
var mkdirp = require('mkdirp');
|
||||
var test = require('tap').test;
|
||||
var p = require('path').resolve(__dirname, 'files');
|
||||
|
||||
process.chdir(__dirname)
|
||||
|
||||
// Make sure to reserve the stderr fd
|
||||
process.stderr.write('');
|
||||
|
||||
var num = 4097;
|
||||
var paths = new Array(num);
|
||||
|
||||
test('make files', function (t) {
|
||||
rimraf.sync(p);
|
||||
mkdirp.sync(p);
|
||||
|
||||
for (var i = 0; i < num; ++i) {
|
||||
paths[i] = 'files/file-' + i;
|
||||
fs.writeFileSync(paths[i], 'content');
|
||||
}
|
||||
|
||||
t.end();
|
||||
})
|
||||
|
||||
test('read files', function (t) {
|
||||
// now read them
|
||||
var done = 0;
|
||||
for (var i = 0; i < num; ++i) {
|
||||
fs.readFile(paths[i], function(err, data) {
|
||||
if (err)
|
||||
throw err;
|
||||
|
||||
++done;
|
||||
if (done === num) {
|
||||
t.pass('success');
|
||||
t.end()
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
test('cleanup', function (t) {
|
||||
rimraf.sync(p);
|
||||
t.end();
|
||||
});
|
Reference in New Issue
Block a user