pax.js.html 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501
  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <title>Code coverage report for tar/lib/pax.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> pax.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'>62/62</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'>75/75</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'>9/9</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'>60/60</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</td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
  192. <span class="cline-any cline-yes">11x</span>
  193. <span class="cline-any cline-yes">11x</span>
  194. <span class="cline-any cline-neutral">&nbsp;</span>
  195. <span class="cline-any cline-neutral">&nbsp;</span>
  196. <span class="cline-any cline-neutral">&nbsp;</span>
  197. <span class="cline-any cline-yes">435x</span>
  198. <span class="cline-any cline-yes">435x</span>
  199. <span class="cline-any cline-yes">435x</span>
  200. <span class="cline-any cline-yes">435x</span>
  201. <span class="cline-any cline-yes">435x</span>
  202. <span class="cline-any cline-yes">435x</span>
  203. <span class="cline-any cline-yes">435x</span>
  204. <span class="cline-any cline-yes">435x</span>
  205. <span class="cline-any cline-yes">435x</span>
  206. <span class="cline-any cline-yes">435x</span>
  207. <span class="cline-any cline-yes">435x</span>
  208. <span class="cline-any cline-yes">435x</span>
  209. <span class="cline-any cline-yes">435x</span>
  210. <span class="cline-any cline-yes">435x</span>
  211. <span class="cline-any cline-yes">435x</span>
  212. <span class="cline-any cline-yes">435x</span>
  213. <span class="cline-any cline-neutral">&nbsp;</span>
  214. <span class="cline-any cline-neutral">&nbsp;</span>
  215. <span class="cline-any cline-neutral">&nbsp;</span>
  216. <span class="cline-any cline-yes">34x</span>
  217. <span class="cline-any cline-yes">34x</span>
  218. <span class="cline-any cline-yes">1x</span>
  219. <span class="cline-any cline-neutral">&nbsp;</span>
  220. <span class="cline-any cline-yes">33x</span>
  221. <span class="cline-any cline-neutral">&nbsp;</span>
  222. <span class="cline-any cline-neutral">&nbsp;</span>
  223. <span class="cline-any cline-yes">33x</span>
  224. <span class="cline-any cline-yes">33x</span>
  225. <span class="cline-any cline-neutral">&nbsp;</span>
  226. <span class="cline-any cline-neutral">&nbsp;</span>
  227. <span class="cline-any cline-yes">33x</span>
  228. <span class="cline-any cline-yes">16896x</span>
  229. <span class="cline-any cline-neutral">&nbsp;</span>
  230. <span class="cline-any cline-neutral">&nbsp;</span>
  231. <span class="cline-any cline-yes">33x</span>
  232. <span class="cline-any cline-neutral">&nbsp;</span>
  233. <span class="cline-any cline-neutral">&nbsp;</span>
  234. <span class="cline-any cline-neutral">&nbsp;</span>
  235. <span class="cline-any cline-neutral">&nbsp;</span>
  236. <span class="cline-any cline-neutral">&nbsp;</span>
  237. <span class="cline-any cline-neutral">&nbsp;</span>
  238. <span class="cline-any cline-neutral">&nbsp;</span>
  239. <span class="cline-any cline-neutral">&nbsp;</span>
  240. <span class="cline-any cline-neutral">&nbsp;</span>
  241. <span class="cline-any cline-neutral">&nbsp;</span>
  242. <span class="cline-any cline-neutral">&nbsp;</span>
  243. <span class="cline-any cline-neutral">&nbsp;</span>
  244. <span class="cline-any cline-neutral">&nbsp;</span>
  245. <span class="cline-any cline-neutral">&nbsp;</span>
  246. <span class="cline-any cline-neutral">&nbsp;</span>
  247. <span class="cline-any cline-neutral">&nbsp;</span>
  248. <span class="cline-any cline-neutral">&nbsp;</span>
  249. <span class="cline-any cline-neutral">&nbsp;</span>
  250. <span class="cline-any cline-neutral">&nbsp;</span>
  251. <span class="cline-any cline-yes">33x</span>
  252. <span class="cline-any cline-neutral">&nbsp;</span>
  253. <span class="cline-any cline-neutral">&nbsp;</span>
  254. <span class="cline-any cline-yes">33x</span>
  255. <span class="cline-any cline-yes">8949x</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-yes">33x</span>
  259. <span class="cline-any cline-neutral">&nbsp;</span>
  260. <span class="cline-any cline-neutral">&nbsp;</span>
  261. <span class="cline-any cline-neutral">&nbsp;</span>
  262. <span class="cline-any cline-yes">34x</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-neutral">&nbsp;</span>
  267. <span class="cline-any cline-neutral">&nbsp;</span>
  268. <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</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-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">510x</span>
  283. <span class="cline-any cline-yes">204x</span>
  284. <span class="cline-any cline-yes">306x</span>
  285. <span class="cline-any cline-neutral">&nbsp;</span>
  286. <span class="cline-any cline-yes">306x</span>
  287. <span class="cline-any cline-neutral">&nbsp;</span>
  288. <span class="cline-any cline-neutral">&nbsp;</span>
  289. <span class="cline-any cline-neutral">&nbsp;</span>
  290. <span class="cline-any cline-yes">306x</span>
  291. <span class="cline-any cline-neutral">&nbsp;</span>
  292. <span class="cline-any cline-neutral">&nbsp;</span>
  293. <span class="cline-any cline-neutral">&nbsp;</span>
  294. <span class="cline-any cline-yes">306x</span>
  295. <span class="cline-any cline-yes">306x</span>
  296. <span class="cline-any cline-yes">30x</span>
  297. <span class="cline-any cline-yes">306x</span>
  298. <span class="cline-any cline-yes">306x</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">401x</span>
  303. <span class="cline-any cline-neutral">&nbsp;</span>
  304. <span class="cline-any cline-yes">11x</span>
  305. <span class="cline-any cline-yes">401x</span>
  306. <span class="cline-any cline-neutral">&nbsp;</span>
  307. <span class="cline-any cline-yes">11x</span>
  308. <span class="cline-any cline-yes">401x</span>
  309. <span class="cline-any cline-neutral">&nbsp;</span>
  310. <span class="cline-any cline-neutral">&nbsp;</span>
  311. <span class="cline-any cline-neutral">&nbsp;</span>
  312. <span class="cline-any cline-neutral">&nbsp;</span>
  313. <span class="cline-any cline-yes">11x</span>
  314. <span class="cline-any cline-yes">2259x</span>
  315. <span class="cline-any cline-neutral">&nbsp;</span>
  316. <span class="cline-any cline-neutral">&nbsp;</span>
  317. <span class="cline-any cline-neutral">&nbsp;</span>
  318. <span class="cline-any cline-yes">2259x</span>
  319. <span class="cline-any cline-yes">5x</span>
  320. <span class="cline-any cline-neutral">&nbsp;</span>
  321. <span class="cline-any cline-yes">2254x</span>
  322. <span class="cline-any cline-yes">2254x</span>
  323. <span class="cline-any cline-yes">2254x</span>
  324. <span class="cline-any cline-yes">2254x</span>
  325. <span class="cline-any cline-yes">1x</span>
  326. <span class="cline-any cline-neutral">&nbsp;</span>
  327. <span class="cline-any cline-yes">2253x</span>
  328. <span class="cline-any cline-yes">2253x</span>
  329. <span class="cline-any cline-neutral">&nbsp;</span>
  330. <span class="cline-any cline-neutral">&nbsp;</span>
  331. <span class="cline-any cline-neutral">&nbsp;</span>
  332. <span class="cline-any cline-yes">2253x</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">11x</span>
  336. <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">'use strict'
  337. const Header = require('./header.js')
  338. const path = require('path')
  339. &nbsp;
  340. class Pax {
  341. constructor (obj, global) {
  342. this.atime = obj.atime || null
  343. this.charset = obj.charset || null
  344. this.comment = obj.comment || null
  345. this.ctime = obj.ctime || null
  346. this.gid = obj.gid || null
  347. this.gname = obj.gname || null
  348. this.linkpath = obj.linkpath || null
  349. this.mtime = obj.mtime || null
  350. this.path = obj.path || null
  351. this.size = obj.size || null
  352. this.uid = obj.uid || null
  353. this.uname = obj.uname || null
  354. this.dev = obj.dev || null
  355. this.ino = obj.ino || null
  356. this.nlink = obj.nlink || null
  357. this.global = global || false
  358. }
  359. &nbsp;
  360. encode () {
  361. const body = this.encodeBody()
  362. if (body === '')
  363. return null
  364. &nbsp;
  365. const bodyLen = Buffer.byteLength(body)
  366. // round up to 512 bytes
  367. // add 512 for header
  368. const bufLen = 512 * Math.ceil(1 + bodyLen / 512)
  369. const buf = Buffer.allocUnsafe(bufLen)
  370. &nbsp;
  371. // 0-fill the header section, it might not hit every field
  372. for (let i = 0; i &lt; 512; i++) {
  373. buf[i] = 0
  374. }
  375. &nbsp;
  376. new Header({
  377. // XXX split the path
  378. // then the path should be PaxHeader + basename, but less than 99,
  379. // prepend with the dirname
  380. path: ('PaxHeader/' + path.basename(this.path)).slice(0, 99),
  381. mode: this.mode || 0o644,
  382. uid: this.uid || null,
  383. gid: this.gid || null,
  384. size: bodyLen,
  385. mtime: this.mtime || null,
  386. type: this.global ? 'GlobalExtendedHeader' : 'ExtendedHeader',
  387. linkpath: '',
  388. uname: this.uname || '',
  389. gname: this.gname || '',
  390. devmaj: 0,
  391. devmin: 0,
  392. atime: this.atime || null,
  393. ctime: this.ctime || null
  394. }).encode(buf)
  395. &nbsp;
  396. buf.write(body, 512, bodyLen, 'utf8')
  397. &nbsp;
  398. // null pad after the body
  399. for (let i = bodyLen + 512; i &lt; buf.length; i++) {
  400. buf[i] = 0
  401. }
  402. &nbsp;
  403. return buf
  404. }
  405. &nbsp;
  406. encodeBody () {
  407. return (
  408. this.encodeField('path') +
  409. this.encodeField('ctime') +
  410. this.encodeField('atime') +
  411. this.encodeField('dev') +
  412. this.encodeField('ino') +
  413. this.encodeField('nlink') +
  414. this.encodeField('charset') +
  415. this.encodeField('comment') +
  416. this.encodeField('gid') +
  417. this.encodeField('gname') +
  418. this.encodeField('linkpath') +
  419. this.encodeField('mtime') +
  420. this.encodeField('size') +
  421. this.encodeField('uid') +
  422. this.encodeField('uname')
  423. )
  424. }
  425. &nbsp;
  426. encodeField (field) {
  427. if (this[field] === null || this[field] === undefined)
  428. return ''
  429. const v = this[field] instanceof Date ? this[field].getTime() / 1000
  430. : this[field]
  431. const s = ' ' +
  432. (field === 'dev' || field === 'ino' || field === 'nlink'
  433. ? 'SCHILY.' : '') +
  434. field + '=' + v + '\n'
  435. const byteLen = Buffer.byteLength(s)
  436. // the digits includes the length of the digits in ascii base-10
  437. // so if it's 9 characters, then adding 1 for the 9 makes it 10
  438. // which makes it 11 chars.
  439. let digits = Math.floor(Math.log(byteLen) / Math.log(10)) + 1
  440. if (byteLen + digits &gt;= Math.pow(10, digits))
  441. digits += 1
  442. const len = digits + byteLen
  443. return len + s
  444. }
  445. }
  446. &nbsp;
  447. Pax.parse = (string, ex, g) =&gt; new Pax(merge(parseKV(string), ex), g)
  448. &nbsp;
  449. const merge = (a, b) =&gt;
  450. b ? Object.keys(a).reduce((s, k) =&gt; (s[k] = a[k], s), b) : a
  451. &nbsp;
  452. const parseKV = string =&gt;
  453. string
  454. .replace(/\n$/, '')
  455. .split('\n')
  456. .reduce(parseKVLine, Object.create(null))
  457. &nbsp;
  458. const parseKVLine = (set, line) =&gt; {
  459. const n = parseInt(line, 10)
  460. &nbsp;
  461. // XXX Values with \n in them will fail this.
  462. // Refactor to not be a naive line-by-line parse.
  463. if (n !== Buffer.byteLength(line) + 1)
  464. return set
  465. &nbsp;
  466. line = line.substr((n + ' ').length)
  467. const kv = line.split('=')
  468. const k = kv.shift().replace(/^SCHILY\.(dev|ino|nlink)/, '$1')
  469. if (!k)
  470. return set
  471. &nbsp;
  472. const v = kv.join('=')
  473. set[k] = /^([A-Z]+\.)?([mac]|birth|creation)time$/.test(k)
  474. ? new Date(v * 1000)
  475. : /^[0-9]+$/.test(v) ? +v
  476. : v
  477. return set
  478. }
  479. &nbsp;
  480. module.exports = Pax
  481. &nbsp;</pre></td></tr>
  482. </table></pre>
  483. <div class='push'></div><!-- for sticky footer -->
  484. </div><!-- /wrapper -->
  485. <div class='footer quiet pad2 space-top1 center small'>
  486. Code coverage
  487. generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Mon Nov 20 2017 16:00:38 GMT-0800 (PST)
  488. </div>
  489. </div>
  490. <script src="../../prettify.js"></script>
  491. <script>
  492. window.onload = function () {
  493. if (typeof prettyPrint === 'function') {
  494. prettyPrint();
  495. }
  496. };
  497. </script>
  498. <script src="../../sorter.js"></script>
  499. </body>
  500. </html>