mkdir.js.html 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687
  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <title>Code coverage report for tar/lib/mkdir.js</title>
  5. <meta charset="utf-8" />
  6. <link rel="stylesheet" href="../../prettify.css" />
  7. <link rel="stylesheet" href="../../base.css" />
  8. <meta name="viewport" content="width=device-width, initial-scale=1">
  9. <style type='text/css'>
  10. .coverage-summary .sorter {
  11. background-image: url(../../sort-arrow-sprite.png);
  12. }
  13. </style>
  14. </head>
  15. <body>
  16. <div class='wrapper'>
  17. <div class='pad1'>
  18. <h1>
  19. <a href="../../index.html">All files</a> / <a href="index.html">tar/lib</a> mkdir.js
  20. </h1>
  21. <div class='clearfix'>
  22. <div class='fl pad1y space-right2'>
  23. <span class="strong">100% </span>
  24. <span class="quiet">Statements</span>
  25. <span class='fraction'>130/130</span>
  26. </div>
  27. <div class='fl pad1y space-right2'>
  28. <span class="strong">100% </span>
  29. <span class="quiet">Branches</span>
  30. <span class='fraction'>91/91</span>
  31. </div>
  32. <div class='fl pad1y space-right2'>
  33. <span class="strong">100% </span>
  34. <span class="quiet">Functions</span>
  35. <span class='fraction'>15/15</span>
  36. </div>
  37. <div class='fl pad1y space-right2'>
  38. <span class="strong">100% </span>
  39. <span class="quiet">Lines</span>
  40. <span class='fraction'>128/128</span>
  41. </div>
  42. </div>
  43. </div>
  44. <div class='status-line high'></div>
  45. <pre><table class="coverage">
  46. <tr><td class="line-count quiet">1
  47. 2
  48. 3
  49. 4
  50. 5
  51. 6
  52. 7
  53. 8
  54. 9
  55. 10
  56. 11
  57. 12
  58. 13
  59. 14
  60. 15
  61. 16
  62. 17
  63. 18
  64. 19
  65. 20
  66. 21
  67. 22
  68. 23
  69. 24
  70. 25
  71. 26
  72. 27
  73. 28
  74. 29
  75. 30
  76. 31
  77. 32
  78. 33
  79. 34
  80. 35
  81. 36
  82. 37
  83. 38
  84. 39
  85. 40
  86. 41
  87. 42
  88. 43
  89. 44
  90. 45
  91. 46
  92. 47
  93. 48
  94. 49
  95. 50
  96. 51
  97. 52
  98. 53
  99. 54
  100. 55
  101. 56
  102. 57
  103. 58
  104. 59
  105. 60
  106. 61
  107. 62
  108. 63
  109. 64
  110. 65
  111. 66
  112. 67
  113. 68
  114. 69
  115. 70
  116. 71
  117. 72
  118. 73
  119. 74
  120. 75
  121. 76
  122. 77
  123. 78
  124. 79
  125. 80
  126. 81
  127. 82
  128. 83
  129. 84
  130. 85
  131. 86
  132. 87
  133. 88
  134. 89
  135. 90
  136. 91
  137. 92
  138. 93
  139. 94
  140. 95
  141. 96
  142. 97
  143. 98
  144. 99
  145. 100
  146. 101
  147. 102
  148. 103
  149. 104
  150. 105
  151. 106
  152. 107
  153. 108
  154. 109
  155. 110
  156. 111
  157. 112
  158. 113
  159. 114
  160. 115
  161. 116
  162. 117
  163. 118
  164. 119
  165. 120
  166. 121
  167. 122
  168. 123
  169. 124
  170. 125
  171. 126
  172. 127
  173. 128
  174. 129
  175. 130
  176. 131
  177. 132
  178. 133
  179. 134
  180. 135
  181. 136
  182. 137
  183. 138
  184. 139
  185. 140
  186. 141
  187. 142
  188. 143
  189. 144
  190. 145
  191. 146
  192. 147
  193. 148
  194. 149
  195. 150
  196. 151
  197. 152
  198. 153
  199. 154
  200. 155
  201. 156
  202. 157
  203. 158
  204. 159
  205. 160
  206. 161
  207. 162
  208. 163
  209. 164
  210. 165
  211. 166
  212. 167
  213. 168
  214. 169
  215. 170
  216. 171
  217. 172
  218. 173
  219. 174
  220. 175
  221. 176
  222. 177
  223. 178
  224. 179
  225. 180
  226. 181
  227. 182
  228. 183
  229. 184
  230. 185
  231. 186
  232. 187
  233. 188
  234. 189
  235. 190
  236. 191
  237. 192
  238. 193
  239. 194
  240. 195
  241. 196
  242. 197
  243. 198
  244. 199
  245. 200
  246. 201
  247. 202
  248. 203
  249. 204
  250. 205
  251. 206
  252. 207
  253. 208</td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
  254. <span class="cline-any cline-neutral">&nbsp;</span>
  255. <span class="cline-any cline-neutral">&nbsp;</span>
  256. <span class="cline-any cline-neutral">&nbsp;</span>
  257. <span class="cline-any cline-neutral">&nbsp;</span>
  258. <span class="cline-any cline-neutral">&nbsp;</span>
  259. <span class="cline-any cline-yes">3x</span>
  260. <span class="cline-any cline-yes">3x</span>
  261. <span class="cline-any cline-yes">3x</span>
  262. <span class="cline-any cline-yes">3x</span>
  263. <span class="cline-any cline-neutral">&nbsp;</span>
  264. <span class="cline-any cline-neutral">&nbsp;</span>
  265. <span class="cline-any cline-neutral">&nbsp;</span>
  266. <span class="cline-any cline-yes">4x</span>
  267. <span class="cline-any cline-yes">4x</span>
  268. <span class="cline-any cline-yes">4x</span>
  269. <span class="cline-any cline-neutral">&nbsp;</span>
  270. <span class="cline-any cline-neutral">&nbsp;</span>
  271. <span class="cline-any cline-neutral">&nbsp;</span>
  272. <span class="cline-any cline-yes">8x</span>
  273. <span class="cline-any cline-neutral">&nbsp;</span>
  274. <span class="cline-any cline-neutral">&nbsp;</span>
  275. <span class="cline-any cline-neutral">&nbsp;</span>
  276. <span class="cline-any cline-neutral">&nbsp;</span>
  277. <span class="cline-any cline-neutral">&nbsp;</span>
  278. <span class="cline-any cline-yes">12x</span>
  279. <span class="cline-any cline-yes">12x</span>
  280. <span class="cline-any cline-yes">12x</span>
  281. <span class="cline-any cline-neutral">&nbsp;</span>
  282. <span class="cline-any cline-neutral">&nbsp;</span>
  283. <span class="cline-any cline-neutral">&nbsp;</span>
  284. <span class="cline-any cline-yes">36x</span>
  285. <span class="cline-any cline-neutral">&nbsp;</span>
  286. <span class="cline-any cline-neutral">&nbsp;</span>
  287. <span class="cline-any cline-neutral">&nbsp;</span>
  288. <span class="cline-any cline-yes">3x</span>
  289. <span class="cline-any cline-neutral">&nbsp;</span>
  290. <span class="cline-any cline-neutral">&nbsp;</span>
  291. <span class="cline-any cline-yes">451x</span>
  292. <span class="cline-any cline-yes">451x</span>
  293. <span class="cline-any cline-yes">451x</span>
  294. <span class="cline-any cline-neutral">&nbsp;</span>
  295. <span class="cline-any cline-yes">451x</span>
  296. <span class="cline-any cline-yes">451x</span>
  297. <span class="cline-any cline-yes">451x</span>
  298. <span class="cline-any cline-neutral">&nbsp;</span>
  299. <span class="cline-any cline-neutral">&nbsp;</span>
  300. <span class="cline-any cline-neutral">&nbsp;</span>
  301. <span class="cline-any cline-yes">451x</span>
  302. <span class="cline-any cline-yes">451x</span>
  303. <span class="cline-any cline-yes">451x</span>
  304. <span class="cline-any cline-yes">451x</span>
  305. <span class="cline-any cline-neutral">&nbsp;</span>
  306. <span class="cline-any cline-yes">451x</span>
  307. <span class="cline-any cline-yes">457x</span>
  308. <span class="cline-any cline-yes">15x</span>
  309. <span class="cline-any cline-neutral">&nbsp;</span>
  310. <span class="cline-any cline-yes">442x</span>
  311. <span class="cline-any cline-yes">442x</span>
  312. <span class="cline-any cline-yes">6x</span>
  313. <span class="cline-any cline-yes">436x</span>
  314. <span class="cline-any cline-yes">1x</span>
  315. <span class="cline-any cline-neutral">&nbsp;</span>
  316. <span class="cline-any cline-yes">435x</span>
  317. <span class="cline-any cline-neutral">&nbsp;</span>
  318. <span class="cline-any cline-neutral">&nbsp;</span>
  319. <span class="cline-any cline-neutral">&nbsp;</span>
  320. <span class="cline-any cline-yes">451x</span>
  321. <span class="cline-any cline-yes">272x</span>
  322. <span class="cline-any cline-neutral">&nbsp;</span>
  323. <span class="cline-any cline-yes">179x</span>
  324. <span class="cline-any cline-yes">40x</span>
  325. <span class="cline-any cline-yes">40x</span>
  326. <span class="cline-any cline-yes">2x</span>
  327. <span class="cline-any cline-yes">40x</span>
  328. <span class="cline-any cline-neutral">&nbsp;</span>
  329. <span class="cline-any cline-neutral">&nbsp;</span>
  330. <span class="cline-any cline-yes">139x</span>
  331. <span class="cline-any cline-yes">8x</span>
  332. <span class="cline-any cline-neutral">&nbsp;</span>
  333. <span class="cline-any cline-yes">131x</span>
  334. <span class="cline-any cline-yes">131x</span>
  335. <span class="cline-any cline-yes">131x</span>
  336. <span class="cline-any cline-neutral">&nbsp;</span>
  337. <span class="cline-any cline-neutral">&nbsp;</span>
  338. <span class="cline-any cline-yes">3x</span>
  339. <span class="cline-any cline-yes">1062x</span>
  340. <span class="cline-any cline-yes">119x</span>
  341. <span class="cline-any cline-yes">943x</span>
  342. <span class="cline-any cline-yes">943x</span>
  343. <span class="cline-any cline-yes">943x</span>
  344. <span class="cline-any cline-yes">723x</span>
  345. <span class="cline-any cline-yes">220x</span>
  346. <span class="cline-any cline-neutral">&nbsp;</span>
  347. <span class="cline-any cline-neutral">&nbsp;</span>
  348. <span class="cline-any cline-yes">222x</span>
  349. <span class="cline-any cline-yes">222x</span>
  350. <span class="cline-any cline-yes">36x</span>
  351. <span class="cline-any cline-neutral">&nbsp;</span>
  352. <span class="cline-any cline-yes">4x</span>
  353. <span class="cline-any cline-neutral">&nbsp;</span>
  354. <span class="cline-any cline-yes">32x</span>
  355. <span class="cline-any cline-yes">32x</span>
  356. <span class="cline-any cline-yes">4x</span>
  357. <span class="cline-any cline-yes">28x</span>
  358. <span class="cline-any cline-yes">22x</span>
  359. <span class="cline-any cline-yes">6x</span>
  360. <span class="cline-any cline-yes">3x</span>
  361. <span class="cline-any cline-yes">3x</span>
  362. <span class="cline-any cline-yes">1x</span>
  363. <span class="cline-any cline-yes">2x</span>
  364. <span class="cline-any cline-neutral">&nbsp;</span>
  365. <span class="cline-any cline-yes">3x</span>
  366. <span class="cline-any cline-yes">2x</span>
  367. <span class="cline-any cline-neutral">&nbsp;</span>
  368. <span class="cline-any cline-yes">1x</span>
  369. <span class="cline-any cline-neutral">&nbsp;</span>
  370. <span class="cline-any cline-neutral">&nbsp;</span>
  371. <span class="cline-any cline-yes">186x</span>
  372. <span class="cline-any cline-yes">186x</span>
  373. <span class="cline-any cline-neutral">&nbsp;</span>
  374. <span class="cline-any cline-neutral">&nbsp;</span>
  375. <span class="cline-any cline-neutral">&nbsp;</span>
  376. <span class="cline-any cline-yes">3x</span>
  377. <span class="cline-any cline-neutral">&nbsp;</span>
  378. <span class="cline-any cline-neutral">&nbsp;</span>
  379. <span class="cline-any cline-yes">276x</span>
  380. <span class="cline-any cline-yes">276x</span>
  381. <span class="cline-any cline-yes">276x</span>
  382. <span class="cline-any cline-neutral">&nbsp;</span>
  383. <span class="cline-any cline-yes">276x</span>
  384. <span class="cline-any cline-yes">276x</span>
  385. <span class="cline-any cline-yes">276x</span>
  386. <span class="cline-any cline-neutral">&nbsp;</span>
  387. <span class="cline-any cline-neutral">&nbsp;</span>
  388. <span class="cline-any cline-neutral">&nbsp;</span>
  389. <span class="cline-any cline-yes">276x</span>
  390. <span class="cline-any cline-yes">276x</span>
  391. <span class="cline-any cline-yes">276x</span>
  392. <span class="cline-any cline-yes">276x</span>
  393. <span class="cline-any cline-neutral">&nbsp;</span>
  394. <span class="cline-any cline-yes">276x</span>
  395. <span class="cline-any cline-yes">266x</span>
  396. <span class="cline-any cline-yes">266x</span>
  397. <span class="cline-any cline-yes">6x</span>
  398. <span class="cline-any cline-yes">266x</span>
  399. <span class="cline-any cline-yes">1x</span>
  400. <span class="cline-any cline-yes">266x</span>
  401. <span class="cline-any cline-neutral">&nbsp;</span>
  402. <span class="cline-any cline-neutral">&nbsp;</span>
  403. <span class="cline-any cline-yes">276x</span>
  404. <span class="cline-any cline-yes">128x</span>
  405. <span class="cline-any cline-neutral">&nbsp;</span>
  406. <span class="cline-any cline-yes">148x</span>
  407. <span class="cline-any cline-yes">34x</span>
  408. <span class="cline-any cline-yes">34x</span>
  409. <span class="cline-any cline-yes">34x</span>
  410. <span class="cline-any cline-yes">34x</span>
  411. <span class="cline-any cline-neutral">&nbsp;</span>
  412. <span class="cline-any cline-yes">1x</span>
  413. <span class="cline-any cline-neutral">&nbsp;</span>
  414. <span class="cline-any cline-yes">34x</span>
  415. <span class="cline-any cline-yes">2x</span>
  416. <span class="cline-any cline-neutral">&nbsp;</span>
  417. <span class="cline-any cline-yes">32x</span>
  418. <span class="cline-any cline-yes">32x</span>
  419. <span class="cline-any cline-neutral">&nbsp;</span>
  420. <span class="cline-any cline-neutral">&nbsp;</span>
  421. <span class="cline-any cline-yes">114x</span>
  422. <span class="cline-any cline-yes">7x</span>
  423. <span class="cline-any cline-neutral">&nbsp;</span>
  424. <span class="cline-any cline-yes">107x</span>
  425. <span class="cline-any cline-yes">107x</span>
  426. <span class="cline-any cline-yes">107x</span>
  427. <span class="cline-any cline-yes">107x</span>
  428. <span class="cline-any cline-neutral">&nbsp;</span>
  429. <span class="cline-any cline-neutral">&nbsp;</span>
  430. <span class="cline-any cline-neutral">&nbsp;</span>
  431. <span class="cline-any cline-yes">792x</span>
  432. <span class="cline-any cline-yes">608x</span>
  433. <span class="cline-any cline-neutral">&nbsp;</span>
  434. <span class="cline-any cline-yes">184x</span>
  435. <span class="cline-any cline-yes">184x</span>
  436. <span class="cline-any cline-yes">169x</span>
  437. <span class="cline-any cline-yes">169x</span>
  438. <span class="cline-any cline-neutral">&nbsp;</span>
  439. <span class="cline-any cline-yes">15x</span>
  440. <span class="cline-any cline-neutral">&nbsp;</span>
  441. <span class="cline-any cline-yes">4x</span>
  442. <span class="cline-any cline-neutral">&nbsp;</span>
  443. <span class="cline-any cline-yes">11x</span>
  444. <span class="cline-any cline-yes">9x</span>
  445. <span class="cline-any cline-yes">4x</span>
  446. <span class="cline-any cline-yes">4x</span>
  447. <span class="cline-any cline-yes">5x</span>
  448. <span class="cline-any cline-yes">2x</span>
  449. <span class="cline-any cline-yes">2x</span>
  450. <span class="cline-any cline-yes">2x</span>
  451. <span class="cline-any cline-yes">2x</span>
  452. <span class="cline-any cline-yes">2x</span>
  453. <span class="cline-any cline-yes">3x</span>
  454. <span class="cline-any cline-yes">2x</span>
  455. <span class="cline-any cline-neutral">&nbsp;</span>
  456. <span class="cline-any cline-neutral">&nbsp;</span>
  457. <span class="cline-any cline-neutral">&nbsp;</span>
  458. <span class="cline-any cline-yes">99x</span>
  459. <span class="cline-any cline-neutral">&nbsp;</span>
  460. <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">'use strict'
  461. // wrapper around mkdirp for tar's needs.
  462. &nbsp;
  463. // TODO: This should probably be a class, not functionally
  464. // passing around state in a gazillion args.
  465. &nbsp;
  466. const mkdirp = require('mkdirp')
  467. const fs = require('fs')
  468. const path = require('path')
  469. const chownr = require('chownr')
  470. &nbsp;
  471. class SymlinkError extends Error {
  472. constructor (symlink, path) {
  473. super('Cannot extract through symbolic link')
  474. this.path = path
  475. this.symlink = symlink
  476. }
  477. &nbsp;
  478. get name () {
  479. return 'SylinkError'
  480. }
  481. }
  482. &nbsp;
  483. class CwdError extends Error {
  484. constructor (path, code) {
  485. super(code + ': Cannot cd into \'' + path + '\'')
  486. this.path = path
  487. this.code = code
  488. }
  489. &nbsp;
  490. get name () {
  491. return 'CwdError'
  492. }
  493. }
  494. &nbsp;
  495. const mkdir = module.exports = (dir, opt, cb) =&gt; {
  496. // if there's any overlap between mask and mode,
  497. // then we'll need an explicit chmod
  498. const umask = opt.umask
  499. const mode = opt.mode | 0o0700
  500. const needChmod = (mode &amp; umask) !== 0
  501. &nbsp;
  502. const uid = opt.uid
  503. const gid = opt.gid
  504. const doChown = typeof uid === 'number' &amp;&amp;
  505. typeof gid === 'number' &amp;&amp;
  506. ( uid !== opt.processUid || gid !== opt.processGid )
  507. &nbsp;
  508. const preserve = opt.preserve
  509. const unlink = opt.unlink
  510. const cache = opt.cache
  511. const cwd = opt.cwd
  512. &nbsp;
  513. const done = (er, created) =&gt; {
  514. if (er)
  515. cb(er)
  516. else {
  517. cache.set(dir, true)
  518. if (created &amp;&amp; doChown)
  519. chownr(created, uid, gid, er =&gt; done(er))
  520. else if (needChmod)
  521. fs.chmod(dir, mode, cb)
  522. else
  523. cb()
  524. }
  525. }
  526. &nbsp;
  527. if (cache &amp;&amp; cache.get(dir) === true)
  528. return done()
  529. &nbsp;
  530. if (dir === cwd)
  531. return fs.lstat(dir, (er, st) =&gt; {
  532. if (er || !st.isDirectory())
  533. er = new CwdError(dir, er &amp;&amp; er.code || 'ENOTDIR')
  534. done(er)
  535. })
  536. &nbsp;
  537. if (preserve)
  538. return mkdirp(dir, mode, done)
  539. &nbsp;
  540. const sub = path.relative(cwd, dir)
  541. const parts = sub.split(/\/|\\/)
  542. mkdir_(cwd, parts, mode, cache, unlink, cwd, null, done)
  543. }
  544. &nbsp;
  545. const mkdir_ = (base, parts, mode, cache, unlink, cwd, created, cb) =&gt; {
  546. if (!parts.length)
  547. return cb(null, created)
  548. const p = parts.shift()
  549. const part = base + '/' + p
  550. if (cache.get(part))
  551. return mkdir_(part, parts, mode, cache, unlink, cwd, created, cb)
  552. fs.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb))
  553. }
  554. &nbsp;
  555. const onmkdir = (part, parts, mode, cache, unlink, cwd, created, cb) =&gt; er =&gt; {
  556. if (er) {
  557. if (er.path &amp;&amp; path.dirname(er.path) === cwd &amp;&amp;
  558. (er.code === 'ENOTDIR' || er.code === 'ENOENT'))
  559. return cb(new CwdError(cwd, er.code))
  560. &nbsp;
  561. fs.lstat(part, (statEr, st) =&gt; {
  562. if (statEr)
  563. cb(statEr)
  564. else if (st.isDirectory())
  565. mkdir_(part, parts, mode, cache, unlink, cwd, created, cb)
  566. else if (unlink)
  567. fs.unlink(part, er =&gt; {
  568. if (er)
  569. return cb(er)
  570. fs.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb))
  571. })
  572. else if (st.isSymbolicLink())
  573. return cb(new SymlinkError(part, part + '/' + parts.join('/')))
  574. else
  575. cb(er)
  576. })
  577. } else {
  578. created = created || part
  579. mkdir_(part, parts, mode, cache, unlink, cwd, created, cb)
  580. }
  581. }
  582. &nbsp;
  583. const mkdirSync = module.exports.sync = (dir, opt) =&gt; {
  584. // if there's any overlap between mask and mode,
  585. // then we'll need an explicit chmod
  586. const umask = opt.umask
  587. const mode = opt.mode | 0o0700
  588. const needChmod = (mode &amp; umask) !== 0
  589. &nbsp;
  590. const uid = opt.uid
  591. const gid = opt.gid
  592. const doChown = typeof uid === 'number' &amp;&amp;
  593. typeof gid === 'number' &amp;&amp;
  594. ( uid !== opt.processUid || gid !== opt.processGid )
  595. &nbsp;
  596. const preserve = opt.preserve
  597. const unlink = opt.unlink
  598. const cache = opt.cache
  599. const cwd = opt.cwd
  600. &nbsp;
  601. const done = (created) =&gt; {
  602. cache.set(dir, true)
  603. if (created &amp;&amp; doChown)
  604. chownr.sync(created, uid, gid)
  605. if (needChmod)
  606. fs.chmodSync(dir, mode)
  607. cache.set(dir, true)
  608. }
  609. &nbsp;
  610. if (cache &amp;&amp; cache.get(dir) === true)
  611. return done()
  612. &nbsp;
  613. if (dir === cwd) {
  614. let ok = false
  615. let code = 'ENOTDIR'
  616. try {
  617. ok = fs.lstatSync(dir).isDirectory()
  618. } catch (er) {
  619. code = er.code
  620. } finally {
  621. if (!ok)
  622. throw new CwdError(dir, code)
  623. }
  624. done()
  625. return
  626. }
  627. &nbsp;
  628. if (preserve)
  629. return done(mkdirp.sync(dir, mode))
  630. &nbsp;
  631. const sub = path.relative(cwd, dir)
  632. const parts = sub.split(/\/|\\/)
  633. let created = null
  634. for (let p = parts.shift(), part = cwd;
  635. p &amp;&amp; (part += '/' + p);
  636. p = parts.shift()) {
  637. &nbsp;
  638. if (cache.get(part))
  639. continue
  640. &nbsp;
  641. try {
  642. fs.mkdirSync(part, mode)
  643. created = created || part
  644. cache.set(part, true)
  645. } catch (er) {
  646. if (er.path &amp;&amp; path.dirname(er.path) === cwd &amp;&amp;
  647. (er.code === 'ENOTDIR' || er.code === 'ENOENT'))
  648. return new CwdError(cwd, er.code)
  649. &nbsp;
  650. const st = fs.lstatSync(part)
  651. if (st.isDirectory()) {
  652. cache.set(part, true)
  653. continue
  654. } else if (unlink) {
  655. fs.unlinkSync(part)
  656. fs.mkdirSync(part, mode)
  657. created = created || part
  658. cache.set(part, true)
  659. continue
  660. } else if (st.isSymbolicLink())
  661. return new SymlinkError(part, part + '/' + parts.join('/'))
  662. }
  663. }
  664. &nbsp;
  665. return done(created)
  666. }
  667. &nbsp;</pre></td></tr>
  668. </table></pre>
  669. <div class='push'></div><!-- for sticky footer -->
  670. </div><!-- /wrapper -->
  671. <div class='footer quiet pad2 space-top1 center small'>
  672. Code coverage
  673. generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Mon Nov 20 2017 16:00:38 GMT-0800 (PST)
  674. </div>
  675. </div>
  676. <script src="../../prettify.js"></script>
  677. <script>
  678. window.onload = function () {
  679. if (typeof prettyPrint === 'function') {
  680. prettyPrint();
  681. }
  682. };
  683. </script>
  684. <script src="../../sorter.js"></script>
  685. </body>
  686. </html>