replace.js.html 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723
  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <title>Code coverage report for tar/lib/replace.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> replace.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'>131/131</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'>70/70</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'>18/18</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
  254. 209
  255. 210
  256. 211
  257. 212
  258. 213
  259. 214
  260. 215
  261. 216
  262. 217
  263. 218
  264. 219
  265. 220</td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
  266. <span class="cline-any cline-neutral">&nbsp;</span>
  267. <span class="cline-any cline-neutral">&nbsp;</span>
  268. <span class="cline-any cline-yes">3x</span>
  269. <span class="cline-any cline-yes">3x</span>
  270. <span class="cline-any cline-yes">3x</span>
  271. <span class="cline-any cline-yes">3x</span>
  272. <span class="cline-any cline-yes">3x</span>
  273. <span class="cline-any cline-yes">3x</span>
  274. <span class="cline-any cline-yes">3x</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-neutral">&nbsp;</span>
  279. <span class="cline-any cline-neutral">&nbsp;</span>
  280. <span class="cline-any cline-neutral">&nbsp;</span>
  281. <span class="cline-any cline-neutral">&nbsp;</span>
  282. <span class="cline-any cline-yes">3x</span>
  283. <span class="cline-any cline-neutral">&nbsp;</span>
  284. <span class="cline-any cline-yes">3x</span>
  285. <span class="cline-any cline-yes">70x</span>
  286. <span class="cline-any cline-neutral">&nbsp;</span>
  287. <span class="cline-any cline-yes">70x</span>
  288. <span class="cline-any cline-yes">1x</span>
  289. <span class="cline-any cline-neutral">&nbsp;</span>
  290. <span class="cline-any cline-yes">69x</span>
  291. <span class="cline-any cline-yes">1x</span>
  292. <span class="cline-any cline-neutral">&nbsp;</span>
  293. <span class="cline-any cline-yes">68x</span>
  294. <span class="cline-any cline-yes">1x</span>
  295. <span class="cline-any cline-neutral">&nbsp;</span>
  296. <span class="cline-any cline-yes">67x</span>
  297. <span class="cline-any cline-neutral">&nbsp;</span>
  298. <span class="cline-any cline-yes">67x</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-neutral">&nbsp;</span>
  302. <span class="cline-any cline-yes">3x</span>
  303. <span class="cline-any cline-yes">26x</span>
  304. <span class="cline-any cline-neutral">&nbsp;</span>
  305. <span class="cline-any cline-yes">26x</span>
  306. <span class="cline-any cline-neutral">&nbsp;</span>
  307. <span class="cline-any cline-neutral">&nbsp;</span>
  308. <span class="cline-any cline-neutral">&nbsp;</span>
  309. <span class="cline-any cline-yes">26x</span>
  310. <span class="cline-any cline-yes">26x</span>
  311. <span class="cline-any cline-yes">26x</span>
  312. <span class="cline-any cline-neutral">&nbsp;</span>
  313. <span class="cline-any cline-yes">4x</span>
  314. <span class="cline-any cline-yes">2x</span>
  315. <span class="cline-any cline-neutral">&nbsp;</span>
  316. <span class="cline-any cline-yes">2x</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-yes">24x</span>
  320. <span class="cline-any cline-yes">22x</span>
  321. <span class="cline-any cline-neutral">&nbsp;</span>
  322. <span class="cline-any cline-yes">22x</span>
  323. <span class="cline-any cline-yes">61x</span>
  324. <span class="cline-any cline-yes">63x</span>
  325. <span class="cline-any cline-neutral">&nbsp;</span>
  326. <span class="cline-any cline-neutral">&nbsp;</span>
  327. <span class="cline-any cline-neutral">&nbsp;</span>
  328. <span class="cline-any cline-yes">61x</span>
  329. <span class="cline-any cline-yes">2x</span>
  330. <span class="cline-any cline-neutral">&nbsp;</span>
  331. <span class="cline-any cline-yes">59x</span>
  332. <span class="cline-any cline-yes">2x</span>
  333. <span class="cline-any cline-neutral">&nbsp;</span>
  334. <span class="cline-any cline-neutral">&nbsp;</span>
  335. <span class="cline-any cline-yes">55x</span>
  336. <span class="cline-any cline-yes">55x</span>
  337. <span class="cline-any cline-yes">8x</span>
  338. <span class="cline-any cline-yes">47x</span>
  339. <span class="cline-any cline-yes">47x</span>
  340. <span class="cline-any cline-yes">2x</span>
  341. <span class="cline-any cline-neutral">&nbsp;</span>
  342. <span class="cline-any cline-neutral">&nbsp;</span>
  343. <span class="cline-any cline-yes">45x</span>
  344. <span class="cline-any cline-yes">45x</span>
  345. <span class="cline-any cline-yes">28x</span>
  346. <span class="cline-any cline-neutral">&nbsp;</span>
  347. <span class="cline-any cline-yes">18x</span>
  348. <span class="cline-any cline-neutral">&nbsp;</span>
  349. <span class="cline-any cline-yes">18x</span>
  350. <span class="cline-any cline-neutral">&nbsp;</span>
  351. <span class="cline-any cline-yes">26x</span>
  352. <span class="cline-any cline-yes">8x</span>
  353. <span class="cline-any cline-neutral">&nbsp;</span>
  354. <span class="cline-any cline-neutral">&nbsp;</span>
  355. <span class="cline-any cline-neutral">&nbsp;</span>
  356. <span class="cline-any cline-yes">3x</span>
  357. <span class="cline-any cline-yes">18x</span>
  358. <span class="cline-any cline-neutral">&nbsp;</span>
  359. <span class="cline-any cline-neutral">&nbsp;</span>
  360. <span class="cline-any cline-neutral">&nbsp;</span>
  361. <span class="cline-any cline-yes">18x</span>
  362. <span class="cline-any cline-yes">18x</span>
  363. <span class="cline-any cline-neutral">&nbsp;</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">41x</span>
  367. <span class="cline-any cline-yes">41x</span>
  368. <span class="cline-any cline-neutral">&nbsp;</span>
  369. <span class="cline-any cline-yes">41x</span>
  370. <span class="cline-any cline-yes">37x</span>
  371. <span class="cline-any cline-yes">37x</span>
  372. <span class="cline-any cline-yes">4x</span>
  373. <span class="cline-any cline-neutral">&nbsp;</span>
  374. <span class="cline-any cline-yes">33x</span>
  375. <span class="cline-any cline-neutral">&nbsp;</span>
  376. <span class="cline-any cline-neutral">&nbsp;</span>
  377. <span class="cline-any cline-yes">37x</span>
  378. <span class="cline-any cline-yes">37x</span>
  379. <span class="cline-any cline-yes">8x</span>
  380. <span class="cline-any cline-neutral">&nbsp;</span>
  381. <span class="cline-any cline-yes">29x</span>
  382. <span class="cline-any cline-yes">29x</span>
  383. <span class="cline-any cline-yes">29x</span>
  384. <span class="cline-any cline-yes">112x</span>
  385. <span class="cline-any cline-yes">2x</span>
  386. <span class="cline-any cline-yes">110x</span>
  387. <span class="cline-any cline-yes">110x</span>
  388. <span class="cline-any cline-yes">6x</span>
  389. <span class="cline-any cline-neutral">&nbsp;</span>
  390. <span class="cline-any cline-neutral">&nbsp;</span>
  391. <span class="cline-any cline-neutral">&nbsp;</span>
  392. <span class="cline-any cline-neutral">&nbsp;</span>
  393. <span class="cline-any cline-yes">104x</span>
  394. <span class="cline-any cline-yes">2x</span>
  395. <span class="cline-any cline-neutral">&nbsp;</span>
  396. <span class="cline-any cline-neutral">&nbsp;</span>
  397. <span class="cline-any cline-yes">102x</span>
  398. <span class="cline-any cline-yes">4x</span>
  399. <span class="cline-any cline-neutral">&nbsp;</span>
  400. <span class="cline-any cline-yes">98x</span>
  401. <span class="cline-any cline-yes">98x</span>
  402. <span class="cline-any cline-yes">13x</span>
  403. <span class="cline-any cline-neutral">&nbsp;</span>
  404. <span class="cline-any cline-yes">85x</span>
  405. <span class="cline-any cline-yes">85x</span>
  406. <span class="cline-any cline-yes">4x</span>
  407. <span class="cline-any cline-neutral">&nbsp;</span>
  408. <span class="cline-any cline-yes">81x</span>
  409. <span class="cline-any cline-yes">81x</span>
  410. <span class="cline-any cline-yes">4x</span>
  411. <span class="cline-any cline-neutral">&nbsp;</span>
  412. <span class="cline-any cline-yes">77x</span>
  413. <span class="cline-any cline-yes">46x</span>
  414. <span class="cline-any cline-yes">77x</span>
  415. <span class="cline-any cline-yes">77x</span>
  416. <span class="cline-any cline-neutral">&nbsp;</span>
  417. <span class="cline-any cline-yes">29x</span>
  418. <span class="cline-any cline-neutral">&nbsp;</span>
  419. <span class="cline-any cline-neutral">&nbsp;</span>
  420. <span class="cline-any cline-yes">41x</span>
  421. <span class="cline-any cline-yes">41x</span>
  422. <span class="cline-any cline-yes">41x</span>
  423. <span class="cline-any cline-yes">41x</span>
  424. <span class="cline-any cline-yes">45x</span>
  425. <span class="cline-any cline-yes">4x</span>
  426. <span class="cline-any cline-yes">4x</span>
  427. <span class="cline-any cline-neutral">&nbsp;</span>
  428. <span class="cline-any cline-neutral">&nbsp;</span>
  429. <span class="cline-any cline-yes">41x</span>
  430. <span class="cline-any cline-yes">2x</span>
  431. <span class="cline-any cline-neutral">&nbsp;</span>
  432. <span class="cline-any cline-yes">39x</span>
  433. <span class="cline-any cline-yes">39x</span>
  434. <span class="cline-any cline-yes">2x</span>
  435. <span class="cline-any cline-yes">37x</span>
  436. <span class="cline-any cline-yes">37x</span>
  437. <span class="cline-any cline-yes">4x</span>
  438. <span class="cline-any cline-yes">33x</span>
  439. <span class="cline-any cline-neutral">&nbsp;</span>
  440. <span class="cline-any cline-neutral">&nbsp;</span>
  441. <span class="cline-any cline-neutral">&nbsp;</span>
  442. <span class="cline-any cline-yes">33x</span>
  443. <span class="cline-any cline-yes">33x</span>
  444. <span class="cline-any cline-yes">33x</span>
  445. <span class="cline-any cline-yes">33x</span>
  446. <span class="cline-any cline-neutral">&nbsp;</span>
  447. <span class="cline-any cline-neutral">&nbsp;</span>
  448. <span class="cline-any cline-neutral">&nbsp;</span>
  449. <span class="cline-any cline-yes">41x</span>
  450. <span class="cline-any cline-neutral">&nbsp;</span>
  451. <span class="cline-any cline-neutral">&nbsp;</span>
  452. <span class="cline-any cline-yes">41x</span>
  453. <span class="cline-any cline-neutral">&nbsp;</span>
  454. <span class="cline-any cline-neutral">&nbsp;</span>
  455. <span class="cline-any cline-yes">3x</span>
  456. <span class="cline-any cline-yes">18x</span>
  457. <span class="cline-any cline-yes">19x</span>
  458. <span class="cline-any cline-yes">1x</span>
  459. <span class="cline-any cline-neutral">&nbsp;</span>
  460. <span class="cline-any cline-neutral">&nbsp;</span>
  461. <span class="cline-any cline-neutral">&nbsp;</span>
  462. <span class="cline-any cline-yes">3x</span>
  463. <span class="cline-any cline-neutral">&nbsp;</span>
  464. <span class="cline-any cline-neutral">&nbsp;</span>
  465. <span class="cline-any cline-yes">18x</span>
  466. <span class="cline-any cline-neutral">&nbsp;</span>
  467. <span class="cline-any cline-yes">18x</span>
  468. <span class="cline-any cline-neutral">&nbsp;</span>
  469. <span class="cline-any cline-neutral">&nbsp;</span>
  470. <span class="cline-any cline-yes">3x</span>
  471. <span class="cline-any cline-yes">34x</span>
  472. <span class="cline-any cline-yes">33x</span>
  473. <span class="cline-any cline-yes">33x</span>
  474. <span class="cline-any cline-yes">1x</span>
  475. <span class="cline-any cline-neutral">&nbsp;</span>
  476. <span class="cline-any cline-neutral">&nbsp;</span>
  477. <span class="cline-any cline-yes">3x</span>
  478. <span class="cline-any cline-yes">1x</span>
  479. <span class="cline-any cline-neutral">&nbsp;</span>
  480. <span class="cline-any cline-yes">32x</span>
  481. <span class="cline-any cline-neutral">&nbsp;</span>
  482. <span class="cline-any cline-yes">33x</span>
  483. <span class="cline-any cline-neutral">&nbsp;</span>
  484. <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">'use strict'
  485. &nbsp;
  486. // tar -r
  487. const hlo = require('./high-level-opt.js')
  488. const Pack = require('./pack.js')
  489. const Parse = require('./parse.js')
  490. const fs = require('fs')
  491. const fsm = require('fs-minipass')
  492. const t = require('./list.js')
  493. const path = require('path')
  494. &nbsp;
  495. // starting at the head of the file, read a Header
  496. // If the checksum is invalid, that's our position to start writing
  497. // If it is, jump forward by the specified size (round up to 512)
  498. // and try again.
  499. // Write the new Pack stream starting there.
  500. &nbsp;
  501. const Header = require('./header.js')
  502. &nbsp;
  503. const r = module.exports = (opt_, files, cb) =&gt; {
  504. const opt = hlo(opt_)
  505. &nbsp;
  506. if (!opt.file)
  507. throw new TypeError('file is required')
  508. &nbsp;
  509. if (opt.gzip)
  510. throw new TypeError('cannot append to compressed archives')
  511. &nbsp;
  512. if (!files || !Array.isArray(files) || !files.length)
  513. throw new TypeError('no files or directories specified')
  514. &nbsp;
  515. files = Array.from(files)
  516. &nbsp;
  517. return opt.sync ? replaceSync(opt, files)
  518. : replace(opt, files, cb)
  519. }
  520. &nbsp;
  521. const replaceSync = (opt, files) =&gt; {
  522. const p = new Pack.Sync(opt)
  523. &nbsp;
  524. let threw = true
  525. let fd
  526. let position
  527. &nbsp;
  528. try {
  529. try {
  530. fd = fs.openSync(opt.file, 'r+')
  531. } catch (er) {
  532. if (er.code === 'ENOENT')
  533. fd = fs.openSync(opt.file, 'w+')
  534. else
  535. throw er
  536. }
  537. &nbsp;
  538. const st = fs.fstatSync(fd)
  539. const headBuf = Buffer.alloc(512)
  540. &nbsp;
  541. POSITION: for (position = 0; position &lt; st.size; position += 512) {
  542. for (let bufPos = 0, bytes = 0; bufPos &lt; 512; bufPos += bytes) {
  543. bytes = fs.readSync(
  544. fd, headBuf, bufPos, headBuf.length - bufPos, position + bufPos
  545. )
  546. &nbsp;
  547. if (position === 0 &amp;&amp; headBuf[0] === 0x1f &amp;&amp; headBuf[1] === 0x8b)
  548. throw new Error('cannot append to compressed archives')
  549. &nbsp;
  550. if (!bytes)
  551. break POSITION
  552. }
  553. &nbsp;
  554. let h = new Header(headBuf)
  555. if (!h.cksumValid)
  556. break
  557. let entryBlockSize = 512 * Math.ceil(h.size / 512)
  558. if (position + entryBlockSize + 512 &gt; st.size)
  559. break
  560. // the 512 for the header we just parsed will be added as well
  561. // also jump ahead all the blocks for the body
  562. position += entryBlockSize
  563. if (opt.mtimeCache)
  564. opt.mtimeCache.set(h.path, h.mtime)
  565. }
  566. threw = false
  567. &nbsp;
  568. streamSync(opt, p, position, fd, files)
  569. } finally {
  570. if (threw)
  571. try { fs.closeSync(fd) } catch (er) {}
  572. }
  573. }
  574. &nbsp;
  575. const streamSync = (opt, p, position, fd, files) =&gt; {
  576. const stream = new fsm.WriteStreamSync(opt.file, {
  577. fd: fd,
  578. start: position
  579. })
  580. p.pipe(stream)
  581. addFilesSync(p, files)
  582. }
  583. &nbsp;
  584. const replace = (opt, files, cb) =&gt; {
  585. files = Array.from(files)
  586. const p = new Pack(opt)
  587. &nbsp;
  588. const getPos = (fd, size, cb_) =&gt; {
  589. const cb = (er, pos) =&gt; {
  590. if (er)
  591. fs.close(fd, _ =&gt; cb_(er))
  592. else
  593. cb_(null, pos)
  594. }
  595. &nbsp;
  596. let position = 0
  597. if (size === 0)
  598. return cb(null, 0)
  599. &nbsp;
  600. let bufPos = 0
  601. const headBuf = Buffer.alloc(512)
  602. const onread = (er, bytes) =&gt; {
  603. if (er)
  604. return cb(er)
  605. bufPos += bytes
  606. if (bufPos &lt; 512 &amp;&amp; bytes)
  607. return fs.read(
  608. fd, headBuf, bufPos, headBuf.length - bufPos,
  609. position + bufPos, onread
  610. )
  611. &nbsp;
  612. if (position === 0 &amp;&amp; headBuf[0] === 0x1f &amp;&amp; headBuf[1] === 0x8b)
  613. return cb(new Error('cannot append to compressed archives'))
  614. &nbsp;
  615. // truncated header
  616. if (bufPos &lt; 512)
  617. return cb(null, position)
  618. &nbsp;
  619. const h = new Header(headBuf)
  620. if (!h.cksumValid)
  621. return cb(null, position)
  622. &nbsp;
  623. const entryBlockSize = 512 * Math.ceil(h.size / 512)
  624. if (position + entryBlockSize + 512 &gt; size)
  625. return cb(null, position)
  626. &nbsp;
  627. position += entryBlockSize + 512
  628. if (position &gt;= size)
  629. return cb(null, position)
  630. &nbsp;
  631. if (opt.mtimeCache)
  632. opt.mtimeCache.set(h.path, h.mtime)
  633. bufPos = 0
  634. fs.read(fd, headBuf, 0, 512, position, onread)
  635. }
  636. fs.read(fd, headBuf, 0, 512, position, onread)
  637. }
  638. &nbsp;
  639. const promise = new Promise((resolve, reject) =&gt; {
  640. p.on('error', reject)
  641. let flag = 'r+'
  642. const onopen = (er, fd) =&gt; {
  643. if (er &amp;&amp; er.code === 'ENOENT' &amp;&amp; flag === 'r+') {
  644. flag = 'w+'
  645. return fs.open(opt.file, flag, onopen)
  646. }
  647. &nbsp;
  648. if (er)
  649. return reject(er)
  650. &nbsp;
  651. fs.fstat(fd, (er, st) =&gt; {
  652. if (er)
  653. return reject(er)
  654. getPos(fd, st.size, (er, position) =&gt; {
  655. if (er)
  656. return reject(er)
  657. const stream = new fsm.WriteStream(opt.file, {
  658. fd: fd,
  659. start: position
  660. })
  661. p.pipe(stream)
  662. stream.on('error', reject)
  663. stream.on('close', resolve)
  664. addFilesAsync(p, files)
  665. })
  666. })
  667. }
  668. fs.open(opt.file, flag, onopen)
  669. })
  670. &nbsp;
  671. return cb ? promise.then(cb, cb) : promise
  672. }
  673. &nbsp;
  674. const addFilesSync = (p, files) =&gt; {
  675. files.forEach(file =&gt; {
  676. if (file.charAt(0) === '@')
  677. t({
  678. file: path.resolve(p.cwd, file.substr(1)),
  679. sync: true,
  680. noResume: true,
  681. onentry: entry =&gt; p.add(entry)
  682. })
  683. else
  684. p.add(file)
  685. })
  686. p.end()
  687. }
  688. &nbsp;
  689. const addFilesAsync = (p, files) =&gt; {
  690. while (files.length) {
  691. const file = files.shift()
  692. if (file.charAt(0) === '@')
  693. return t({
  694. file: path.resolve(p.cwd, file.substr(1)),
  695. noResume: true,
  696. onentry: entry =&gt; p.add(entry)
  697. }).then(_ =&gt; addFilesAsync(p, files))
  698. else
  699. p.add(file)
  700. }
  701. p.end()
  702. }
  703. &nbsp;</pre></td></tr>
  704. </table></pre>
  705. <div class='push'></div><!-- for sticky footer -->
  706. </div><!-- /wrapper -->
  707. <div class='footer quiet pad2 space-top1 center small'>
  708. Code coverage
  709. generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Mon Nov 20 2017 16:00:38 GMT-0800 (PST)
  710. </div>
  711. </div>
  712. <script src="../../prettify.js"></script>
  713. <script>
  714. window.onload = function () {
  715. if (typeof prettyPrint === 'function') {
  716. prettyPrint();
  717. }
  718. };
  719. </script>
  720. <script src="../../sorter.js"></script>
  721. </body>
  722. </html>