1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
var log = require("../utils/log")
, fs = require("./graceful-fs")
, path = require("path")
module.exports = mkdir
function mkdir (ensure, chmod, cb) {
ensure = ensure.replace(/\/+$/, '')
if (ensure.charAt(0) !== "/") ensure = path.join(process.cwd(), ensure)
var dirs = ensure.split("/")
, walker = []
if (arguments.length < 3) {
cb = chmod
chmod = 0755
}
walker.push(dirs.shift()) // gobble the "/" first
;(function S (d) {
if (d === undefined) return cb()
walker.push(d)
var dir = walker.join("/")
// must be a real dir!
, stat = (dir === ensure) ? "lstat" : "stat"
fs[stat](dir, function STATCB (er, s) {
if (er) {
fs.mkdir(dir, chmod, function MKDIRCB (er, s) {
if (er && er.message.indexOf("EEXIST") === 0) {
// When multiple concurrent actors are trying to ensure the same directories,
// it can sometimes happen that something doesn't exist when you do the stat,
// and then DOES exist when you try to mkdir. In this case, just go back to
// the stat to make sure it's a dir and not a file.
return fs.stat(dir, STATCB)
}
if (er) return cb(new Error(
"Failed to make "+dir+" while ensuring "+ensure+"\n"+er.message))
S(dirs.shift())
})
} else {
if (s.isDirectory()) S(dirs.shift())
else cb(new Error("Failed to mkdir "+dir+": File exists"))
}
})
})(dirs.shift())
}
|