| <!doctype html> |
| <html lang="en"> |
| <head> |
| <title>Code coverage report for tar/lib/pax.js</title> |
| <meta charset="utf-8" /> |
| <link rel="stylesheet" href="../../prettify.css" /> |
| <link rel="stylesheet" href="../../base.css" /> |
| <meta name="viewport" content="width=device-width, initial-scale=1"> |
| <style type='text/css'> |
| .coverage-summary .sorter { |
| background-image: url(../../sort-arrow-sprite.png); |
| } |
| </style> |
| </head> |
| <body> |
| <div class='wrapper'> |
| <div class='pad1'> |
| <h1> |
| <a href="../../index.html">All files</a> / <a href="index.html">tar/lib</a> pax.js |
| </h1> |
| <div class='clearfix'> |
| <div class='fl pad1y space-right2'> |
| <span class="strong">100% </span> |
| <span class="quiet">Statements</span> |
| <span class='fraction'>62/62</span> |
| </div> |
| <div class='fl pad1y space-right2'> |
| <span class="strong">100% </span> |
| <span class="quiet">Branches</span> |
| <span class='fraction'>75/75</span> |
| </div> |
| <div class='fl pad1y space-right2'> |
| <span class="strong">100% </span> |
| <span class="quiet">Functions</span> |
| <span class='fraction'>9/9</span> |
| </div> |
| <div class='fl pad1y space-right2'> |
| <span class="strong">100% </span> |
| <span class="quiet">Lines</span> |
| <span class='fraction'>60/60</span> |
| </div> |
| </div> |
| </div> |
| <div class='status-line high'></div> |
| <pre><table class="coverage"> |
| <tr><td class="line-count quiet">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 |
| 44 |
| 45 |
| 46 |
| 47 |
| 48 |
| 49 |
| 50 |
| 51 |
| 52 |
| 53 |
| 54 |
| 55 |
| 56 |
| 57 |
| 58 |
| 59 |
| 60 |
| 61 |
| 62 |
| 63 |
| 64 |
| 65 |
| 66 |
| 67 |
| 68 |
| 69 |
| 70 |
| 71 |
| 72 |
| 73 |
| 74 |
| 75 |
| 76 |
| 77 |
| 78 |
| 79 |
| 80 |
| 81 |
| 82 |
| 83 |
| 84 |
| 85 |
| 86 |
| 87 |
| 88 |
| 89 |
| 90 |
| 91 |
| 92 |
| 93 |
| 94 |
| 95 |
| 96 |
| 97 |
| 98 |
| 99 |
| 100 |
| 101 |
| 102 |
| 103 |
| 104 |
| 105 |
| 106 |
| 107 |
| 108 |
| 109 |
| 110 |
| 111 |
| 112 |
| 113 |
| 114 |
| 115 |
| 116 |
| 117 |
| 118 |
| 119 |
| 120 |
| 121 |
| 122 |
| 123 |
| 124 |
| 125 |
| 126 |
| 127 |
| 128 |
| 129 |
| 130 |
| 131 |
| 132 |
| 133 |
| 134 |
| 135 |
| 136 |
| 137 |
| 138 |
| 139 |
| 140 |
| 141 |
| 142 |
| 143 |
| 144 |
| 145 |
| 146</td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-yes">11x</span> |
| <span class="cline-any cline-yes">11x</span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-yes">435x</span> |
| <span class="cline-any cline-yes">435x</span> |
| <span class="cline-any cline-yes">435x</span> |
| <span class="cline-any cline-yes">435x</span> |
| <span class="cline-any cline-yes">435x</span> |
| <span class="cline-any cline-yes">435x</span> |
| <span class="cline-any cline-yes">435x</span> |
| <span class="cline-any cline-yes">435x</span> |
| <span class="cline-any cline-yes">435x</span> |
| <span class="cline-any cline-yes">435x</span> |
| <span class="cline-any cline-yes">435x</span> |
| <span class="cline-any cline-yes">435x</span> |
| <span class="cline-any cline-yes">435x</span> |
| <span class="cline-any cline-yes">435x</span> |
| <span class="cline-any cline-yes">435x</span> |
| <span class="cline-any cline-yes">435x</span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-yes">34x</span> |
| <span class="cline-any cline-yes">34x</span> |
| <span class="cline-any cline-yes">1x</span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-yes">33x</span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-yes">33x</span> |
| <span class="cline-any cline-yes">33x</span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-yes">33x</span> |
| <span class="cline-any cline-yes">16896x</span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-yes">33x</span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-yes">33x</span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-yes">33x</span> |
| <span class="cline-any cline-yes">8949x</span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-yes">33x</span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-yes">34x</span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-yes">510x</span> |
| <span class="cline-any cline-yes">204x</span> |
| <span class="cline-any cline-yes">306x</span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-yes">306x</span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-yes">306x</span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-yes">306x</span> |
| <span class="cline-any cline-yes">306x</span> |
| <span class="cline-any cline-yes">30x</span> |
| <span class="cline-any cline-yes">306x</span> |
| <span class="cline-any cline-yes">306x</span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-yes">401x</span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-yes">11x</span> |
| <span class="cline-any cline-yes">401x</span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-yes">11x</span> |
| <span class="cline-any cline-yes">401x</span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-yes">11x</span> |
| <span class="cline-any cline-yes">2259x</span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-yes">2259x</span> |
| <span class="cline-any cline-yes">5x</span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-yes">2254x</span> |
| <span class="cline-any cline-yes">2254x</span> |
| <span class="cline-any cline-yes">2254x</span> |
| <span class="cline-any cline-yes">2254x</span> |
| <span class="cline-any cline-yes">1x</span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-yes">2253x</span> |
| <span class="cline-any cline-yes">2253x</span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-yes">2253x</span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-neutral"> </span> |
| <span class="cline-any cline-yes">11x</span> |
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">'use strict' |
| const Header = require('./header.js') |
| const path = require('path') |
| |
| class Pax { |
| constructor (obj, global) { |
| this.atime = obj.atime || null |
| this.charset = obj.charset || null |
| this.comment = obj.comment || null |
| this.ctime = obj.ctime || null |
| this.gid = obj.gid || null |
| this.gname = obj.gname || null |
| this.linkpath = obj.linkpath || null |
| this.mtime = obj.mtime || null |
| this.path = obj.path || null |
| this.size = obj.size || null |
| this.uid = obj.uid || null |
| this.uname = obj.uname || null |
| this.dev = obj.dev || null |
| this.ino = obj.ino || null |
| this.nlink = obj.nlink || null |
| this.global = global || false |
| } |
| |
| encode () { |
| const body = this.encodeBody() |
| if (body === '') |
| return null |
| |
| const bodyLen = Buffer.byteLength(body) |
| // round up to 512 bytes |
| // add 512 for header |
| const bufLen = 512 * Math.ceil(1 + bodyLen / 512) |
| const buf = Buffer.allocUnsafe(bufLen) |
| |
| // 0-fill the header section, it might not hit every field |
| for (let i = 0; i < 512; i++) { |
| buf[i] = 0 |
| } |
| |
| new Header({ |
| // XXX split the path |
| // then the path should be PaxHeader + basename, but less than 99, |
| // prepend with the dirname |
| path: ('PaxHeader/' + path.basename(this.path)).slice(0, 99), |
| mode: this.mode || 0o644, |
| uid: this.uid || null, |
| gid: this.gid || null, |
| size: bodyLen, |
| mtime: this.mtime || null, |
| type: this.global ? 'GlobalExtendedHeader' : 'ExtendedHeader', |
| linkpath: '', |
| uname: this.uname || '', |
| gname: this.gname || '', |
| devmaj: 0, |
| devmin: 0, |
| atime: this.atime || null, |
| ctime: this.ctime || null |
| }).encode(buf) |
| |
| buf.write(body, 512, bodyLen, 'utf8') |
| |
| // null pad after the body |
| for (let i = bodyLen + 512; i < buf.length; i++) { |
| buf[i] = 0 |
| } |
| |
| return buf |
| } |
| |
| encodeBody () { |
| return ( |
| this.encodeField('path') + |
| this.encodeField('ctime') + |
| this.encodeField('atime') + |
| this.encodeField('dev') + |
| this.encodeField('ino') + |
| this.encodeField('nlink') + |
| this.encodeField('charset') + |
| this.encodeField('comment') + |
| this.encodeField('gid') + |
| this.encodeField('gname') + |
| this.encodeField('linkpath') + |
| this.encodeField('mtime') + |
| this.encodeField('size') + |
| this.encodeField('uid') + |
| this.encodeField('uname') |
| ) |
| } |
| |
| encodeField (field) { |
| if (this[field] === null || this[field] === undefined) |
| return '' |
| const v = this[field] instanceof Date ? this[field].getTime() / 1000 |
| : this[field] |
| const s = ' ' + |
| (field === 'dev' || field === 'ino' || field === 'nlink' |
| ? 'SCHILY.' : '') + |
| field + '=' + v + '\n' |
| const byteLen = Buffer.byteLength(s) |
| // the digits includes the length of the digits in ascii base-10 |
| // so if it's 9 characters, then adding 1 for the 9 makes it 10 |
| // which makes it 11 chars. |
| let digits = Math.floor(Math.log(byteLen) / Math.log(10)) + 1 |
| if (byteLen + digits >= Math.pow(10, digits)) |
| digits += 1 |
| const len = digits + byteLen |
| return len + s |
| } |
| } |
| |
| Pax.parse = (string, ex, g) => new Pax(merge(parseKV(string), ex), g) |
| |
| const merge = (a, b) => |
| b ? Object.keys(a).reduce((s, k) => (s[k] = a[k], s), b) : a |
| |
| const parseKV = string => |
| string |
| .replace(/\n$/, '') |
| .split('\n') |
| .reduce(parseKVLine, Object.create(null)) |
| |
| const parseKVLine = (set, line) => { |
| const n = parseInt(line, 10) |
| |
| // XXX Values with \n in them will fail this. |
| // Refactor to not be a naive line-by-line parse. |
| if (n !== Buffer.byteLength(line) + 1) |
| return set |
| |
| line = line.substr((n + ' ').length) |
| const kv = line.split('=') |
| const k = kv.shift().replace(/^SCHILY\.(dev|ino|nlink)/, '$1') |
| if (!k) |
| return set |
| |
| const v = kv.join('=') |
| set[k] = /^([A-Z]+\.)?([mac]|birth|creation)time$/.test(k) |
| ? new Date(v * 1000) |
| : /^[0-9]+$/.test(v) ? +v |
| : v |
| return set |
| } |
| |
| module.exports = Pax |
| </pre></td></tr> |
| </table></pre> |
| <div class='push'></div><!-- for sticky footer --> |
| </div><!-- /wrapper --> |
| <div class='footer quiet pad2 space-top1 center small'> |
| Code coverage |
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Mon Nov 20 2017 16:00:38 GMT-0800 (PST) |
| </div> |
| </div> |
| <script src="../../prettify.js"></script> |
| <script> |
| window.onload = function () { |
| if (typeof prettyPrint === 'function') { |
| prettyPrint(); |
| } |
| }; |
| </script> |
| <script src="../../sorter.js"></script> |
| </body> |
| </html> |