@@ -8,6 +8,7 @@ const mkdirp = require('mkdirp')
8
8
const fs = require ( 'fs' )
9
9
const path = require ( 'path' )
10
10
const chownr = require ( 'chownr' )
11
+ const normPath = require ( './normalize-windows-path.js' )
11
12
12
13
class SymlinkError extends Error {
13
14
constructor ( symlink , path ) {
@@ -33,7 +34,11 @@ class CwdError extends Error {
33
34
}
34
35
}
35
36
36
- const mkdir = module . exports = ( dir , opt , cb ) => {
37
+ const cGet = ( cache , key ) => cache . get ( normPath ( key ) )
38
+ const cSet = ( cache , key , val ) => cache . set ( normPath ( key ) , val )
39
+
40
+ module . exports = ( dir , opt , cb ) => {
41
+ dir = normPath ( dir )
37
42
// if there's any overlap between mask and mode,
38
43
// then we'll need an explicit chmod
39
44
const umask = opt . umask
@@ -44,18 +49,18 @@ const mkdir = module.exports = (dir, opt, cb) => {
44
49
const gid = opt . gid
45
50
const doChown = typeof uid === 'number' &&
46
51
typeof gid === 'number' &&
47
- ( uid !== opt . processUid || gid !== opt . processGid )
52
+ ( uid !== opt . processUid || gid !== opt . processGid )
48
53
49
54
const preserve = opt . preserve
50
55
const unlink = opt . unlink
51
56
const cache = opt . cache
52
- const cwd = opt . cwd
57
+ const cwd = normPath ( opt . cwd )
53
58
54
59
const done = ( er , created ) => {
55
60
if ( er )
56
61
cb ( er )
57
62
else {
58
- cache . set ( dir , true )
63
+ cSet ( cache , dir , true )
59
64
if ( created && doChown )
60
65
chownr ( created , uid , gid , er => done ( er ) )
61
66
else if ( needChmod )
@@ -65,21 +70,22 @@ const mkdir = module.exports = (dir, opt, cb) => {
65
70
}
66
71
}
67
72
68
- if ( cache && cache . get ( dir ) === true )
73
+ if ( cache && cGet ( cache , dir ) === true )
69
74
return done ( )
70
75
71
- if ( dir === cwd )
76
+ if ( dir === cwd ) {
72
77
return fs . stat ( dir , ( er , st ) => {
73
78
if ( er || ! st . isDirectory ( ) )
74
79
er = new CwdError ( dir , er && er . code || 'ENOTDIR' )
75
80
done ( er )
76
81
} )
82
+ }
77
83
78
84
if ( preserve )
79
85
return mkdirp ( dir , { mode} ) . then ( made => done ( null , made ) , done )
80
86
81
87
const sub = path . relative ( cwd , dir )
82
- const parts = sub . split ( / \/ | \\ / )
88
+ const parts = sub . split ( '/' )
83
89
mkdir_ ( cwd , parts , mode , cache , unlink , cwd , null , done )
84
90
}
85
91
@@ -88,7 +94,7 @@ const mkdir_ = (base, parts, mode, cache, unlink, cwd, created, cb) => {
88
94
return cb ( null , created )
89
95
const p = parts . shift ( )
90
96
const part = base + '/' + p
91
- if ( cache . get ( part ) )
97
+ if ( cGet ( cache , part ) )
92
98
return mkdir_ ( part , parts , mode , cache , unlink , cwd , created , cb )
93
99
fs . mkdir ( part , mode , onmkdir ( part , parts , mode , cache , unlink , cwd , created , cb ) )
94
100
}
@@ -104,13 +110,13 @@ const onmkdir = (part, parts, mode, cache, unlink, cwd, created, cb) => er => {
104
110
cb ( statEr )
105
111
else if ( st . isDirectory ( ) )
106
112
mkdir_ ( part , parts , mode , cache , unlink , cwd , created , cb )
107
- else if ( unlink )
113
+ else if ( unlink ) {
108
114
fs . unlink ( part , er => {
109
115
if ( er )
110
116
return cb ( er )
111
117
fs . mkdir ( part , mode , onmkdir ( part , parts , mode , cache , unlink , cwd , created , cb ) )
112
118
} )
113
- else if ( st . isSymbolicLink ( ) )
119
+ } else if ( st . isSymbolicLink ( ) )
114
120
return cb ( new SymlinkError ( part , part + '/' + parts . join ( '/' ) ) )
115
121
else
116
122
cb ( er )
@@ -121,7 +127,8 @@ const onmkdir = (part, parts, mode, cache, unlink, cwd, created, cb) => er => {
121
127
}
122
128
}
123
129
124
- const mkdirSync = module . exports . sync = ( dir , opt ) => {
130
+ module . exports . sync = ( dir , opt ) => {
131
+ dir = normPath ( dir )
125
132
// if there's any overlap between mask and mode,
126
133
// then we'll need an explicit chmod
127
134
const umask = opt . umask
@@ -132,22 +139,22 @@ const mkdirSync = module.exports.sync = (dir, opt) => {
132
139
const gid = opt . gid
133
140
const doChown = typeof uid === 'number' &&
134
141
typeof gid === 'number' &&
135
- ( uid !== opt . processUid || gid !== opt . processGid )
142
+ ( uid !== opt . processUid || gid !== opt . processGid )
136
143
137
144
const preserve = opt . preserve
138
145
const unlink = opt . unlink
139
146
const cache = opt . cache
140
- const cwd = opt . cwd
147
+ const cwd = normPath ( opt . cwd )
141
148
142
149
const done = ( created ) => {
143
- cache . set ( dir , true )
150
+ cSet ( cache , dir , true )
144
151
if ( created && doChown )
145
152
chownr . sync ( created , uid , gid )
146
153
if ( needChmod )
147
154
fs . chmodSync ( dir , mode )
148
155
}
149
156
150
- if ( cache && cache . get ( dir ) === true )
157
+ if ( cache && cGet ( cache , dir ) === true )
151
158
return done ( )
152
159
153
160
if ( dir === cwd ) {
@@ -169,33 +176,32 @@ const mkdirSync = module.exports.sync = (dir, opt) => {
169
176
return done ( mkdirp . sync ( dir , mode ) )
170
177
171
178
const sub = path . relative ( cwd , dir )
172
- const parts = sub . split ( / \/ | \\ / )
179
+ const parts = sub . split ( '/' )
173
180
let created = null
174
181
for ( let p = parts . shift ( ) , part = cwd ;
175
- p && ( part += '/' + p ) ;
176
- p = parts . shift ( ) ) {
177
-
178
- if ( cache . get ( part ) )
182
+ p && ( part += '/' + p ) ;
183
+ p = parts . shift ( ) ) {
184
+ if ( cGet ( cache , part ) )
179
185
continue
180
186
181
187
try {
182
188
fs . mkdirSync ( part , mode )
183
189
created = created || part
184
- cache . set ( part , true )
190
+ cSet ( cache , part , true )
185
191
} catch ( er ) {
186
192
if ( er . path && path . dirname ( er . path ) === cwd &&
187
193
( er . code === 'ENOTDIR' || er . code === 'ENOENT' ) )
188
194
return new CwdError ( cwd , er . code )
189
195
190
196
const st = fs . lstatSync ( part )
191
197
if ( st . isDirectory ( ) ) {
192
- cache . set ( part , true )
198
+ cSet ( cache , part , true )
193
199
continue
194
200
} else if ( unlink ) {
195
201
fs . unlinkSync ( part )
196
202
fs . mkdirSync ( part , mode )
197
203
created = created || part
198
- cache . set ( part , true )
204
+ cSet ( cache , part , true )
199
205
continue
200
206
} else if ( st . isSymbolicLink ( ) )
201
207
return new SymlinkError ( part , part + '/' + parts . join ( '/' ) )
0 commit comments