diff options
author | isaacs <i@izs.me> | 2011-12-02 11:11:25 -0800 |
---|---|---|
committer | isaacs <i@izs.me> | 2011-12-02 13:45:08 -0800 |
commit | ffc8110659854179cd002d8859668deb59c19a30 (patch) | |
tree | 76f167061b7c84ec2740b9c7a57d2e4ec8a9d877 /deps/npm/lib | |
parent | 3ebbdc6320a6e11e4c74c81ee700f77762931a21 (diff) | |
download | node-ffc8110659854179cd002d8859668deb59c19a30.tar.gz |
Workaround: A/V software prevents folder rename
Diffstat (limited to 'deps/npm/lib')
-rw-r--r-- | deps/npm/lib/utils/tar.js | 21 |
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 |