1 var crypto = require("crypto")
2 var resolve = require("path").resolve
4 var lockfile = require("lockfile")
5 var log = require("npmlog")
6 var mkdirp = require("mkdirp")
8 var npm = require("../npm.js")
9 var correctMkdir = require('../utils/correct-mkdir.js')
13 function lockFileName (base, name) {
14 var c = name.replace(/[^a-zA-Z0-9]+/g, "-").replace(/^-+|-+$/g, "")
15 , p = resolve(base, name)
16 , h = crypto.createHash("sha1").update(p).digest("hex")
17 , l = resolve(npm.cache, "_locks")
19 return resolve(l, c.substr(0, 24)+"-"+h.substr(0, 16)+".lock")
22 function lock (base, name, cb) {
23 var lockDir = resolve(npm.cache, "_locks")
24 correctMkdir(lockDir, function (er) {
27 var opts = { stale: npm.config.get("cache-lock-stale")
28 , retries: npm.config.get("cache-lock-retries")
29 , wait: npm.config.get("cache-lock-wait") }
30 var lf = lockFileName(base, name)
31 lockfile.lock(lf, opts, function (er) {
32 if (er) log.warn("locking", lf, "failed", er)
35 log.verbose("lock", "using", lf, "for", resolve(base, name))
36 installLocks[lf] = true
44 function unlock (base, name, cb) {
45 var lf = lockFileName(base, name)
46 , locked = installLocks[lf]
47 if (locked === false) {
48 return process.nextTick(cb)
50 else if (locked === true) {
51 lockfile.unlock(lf, function (er) {
53 log.warn("unlocking", lf, "failed", er)
56 installLocks[lf] = false
57 log.verbose("unlock", "done using", lf, "for", resolve(base, name))
65 "Attempt to unlock " + resolve(base, name) + ", which hasn't been locked"