summaryrefslogtreecommitdiff
path: root/deps/npm/lib
diff options
context:
space:
mode:
authorisaacs <i@izs.me>2011-12-02 11:11:25 -0800
committerisaacs <i@izs.me>2011-12-02 13:45:08 -0800
commitffc8110659854179cd002d8859668deb59c19a30 (patch)
tree76f167061b7c84ec2740b9c7a57d2e4ec8a9d877 /deps/npm/lib
parent3ebbdc6320a6e11e4c74c81ee700f77762931a21 (diff)
downloadnode-ffc8110659854179cd002d8859668deb59c19a30.tar.gz
Workaround: A/V software prevents folder rename
Diffstat (limited to 'deps/npm/lib')
-rw-r--r--deps/npm/lib/utils/tar.js21
1 files changed, 20 insertions, 1 deletions
diff --git a/deps/npm/lib/utils/tar.js b/deps/npm/lib/utils/tar.js
index 1fe705377..2c2b96f9a 100644
--- a/deps/npm/lib/utils/tar.js
+++ b/deps/npm/lib/utils/tar.js
@@ -144,7 +144,8 @@ function unpack_ ( tarball, unpackTarget, dMode, fMode, uid, gid, cb ) {
rm(unpackTarget, function (er) {
if (er) return cb(er)
log.verbose(unpackTarget, "rm'ed")
- fs.rename(folder, unpackTarget, function (er) {
+
+ moveIntoPlace(folder, unpackTarget, function (er) {
if (er) return cb(er)
log.verbose([folder, unpackTarget], "renamed")
// curse you, nfs! It will lie and tell you that the
@@ -161,6 +162,24 @@ function unpack_ ( tarball, unpackTarget, dMode, fMode, uid, gid, cb ) {
})
}
+// on Windows, A/V software can lock the directory, causing this
+// to fail with an EACCES. Try again on failure, for up to 1 second.
+// XXX Fix this by not unpacking into a temp directory, instead just
+// renaming things on the way out of the tarball.
+function moveIntoPlace (folder, unpackTarget, cb) {
+ var start = Date.now()
+ fs.rename(folder, unpackTarget, function CB (er) {
+ if (er
+ && process.platform === "win32"
+ && er.code === "EACCES"
+ && Date.now() - start < 1000) {
+ return fs.rename(folder, unpackTarget, CB)
+ }
+ cb(er)
+ })
+}
+
+
function gunzTarPerm (tarball, tmp, dMode, fMode, uid, gid, cb) {
if (!dMode) dMode = npm.modes.exec
if (!fMode) fMode = npm.modes.file