| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367 | // Set the umask, so that it works the same everywhere.process.umask(parseInt('22', 8))var tap = require("tap")  , tar = require("../tar.js")  , fs = require("fs")  , path = require("path")  , file = path.resolve(__dirname, "fixtures/c.tar")  , target = path.resolve(__dirname, "tmp/extract-test")  , index = 0  , fstream = require("fstream")  , ee = 0  , expectEntries =[ { path: 'c.txt',    mode: '644',    type: '0',    depth: undefined,    size: 513,    linkpath: '',    nlink: undefined,    dev: undefined,    ino: undefined },  { path: 'cc.txt',    mode: '644',    type: '0',    depth: undefined,    size: 513,    linkpath: '',    nlink: undefined,    dev: undefined,    ino: undefined },  { path: 'r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',    mode: '644',    type: '0',    depth: undefined,    size: 100,    linkpath: '',    nlink: undefined,    dev: undefined,    ino: undefined },  { path: 'Ω.txt',    mode: '644',    type: '0',    depth: undefined,    size: 2,    linkpath: '',    nlink: undefined,    dev: undefined,    ino: undefined },  { path: 'Ω.txt',    mode: '644',    type: '0',    depth: undefined,    size: 2,    linkpath: '',    nlink: 1,    dev: 234881026,    ino: 51693379 },  { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',    mode: '644',    type: '0',    depth: undefined,    size: 200,    linkpath: '',    nlink: 1,    dev: 234881026,    ino: 51681874 },  { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',    mode: '644',    type: '0',    depth: undefined,    size: 201,    linkpath: '',    nlink: undefined,    dev: undefined,    ino: undefined },  { path: '200LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL',    mode: '777',    type: '2',    depth: undefined,    size: 0,    linkpath: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',    nlink: undefined,    dev: undefined,    ino: undefined },  { path: '200-hard',    mode: '644',    type: '0',    depth: undefined,    size: 200,    linkpath: '',    nlink: 2,    dev: 234881026,    ino: 51681874 },  { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',    mode: '644',    type: '1',    depth: undefined,    size: 0,    linkpath: path.resolve(target, '200-hard'),    nlink: 2,    dev: 234881026,    ino: 51681874 } ]  , ef = 0  , expectFiles =[ { path: '',    mode: '40755',    type: 'Directory',    depth: 0,    linkpath: undefined },  { path: '/200-hard',    mode: '100644',    type: 'File',    depth: 1,    size: 200,    linkpath: undefined,    nlink: 2 },  { path: '/200LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL',    mode: '120777',    type: 'SymbolicLink',    depth: 1,    size: 200,    linkpath: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',    nlink: 1 },  { path: '/200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',    mode: '100644',    type: 'Link',    depth: 1,    size: 200,    linkpath: path.join(target, '200-hard'),    nlink: 2 },  { path: '/c.txt',    mode: '100644',    type: 'File',    depth: 1,    size: 513,    linkpath: undefined,    nlink: 1 },  { path: '/cc.txt',    mode: '100644',    type: 'File',    depth: 1,    size: 513,    linkpath: undefined,    nlink: 1 },  { path: '/r',    mode: '40755',    type: 'Directory',    depth: 1,    linkpath: undefined },  { path: '/r/e',    mode: '40755',    type: 'Directory',    depth: 2,    linkpath: undefined },  { path: '/r/e/a',    mode: '40755',    type: 'Directory',    depth: 3,    linkpath: undefined },  { path: '/r/e/a/l',    mode: '40755',    type: 'Directory',    depth: 4,    linkpath: undefined },  { path: '/r/e/a/l/l',    mode: '40755',    type: 'Directory',    depth: 5,    linkpath: undefined },  { path: '/r/e/a/l/l/y',    mode: '40755',    type: 'Directory',    depth: 6,    linkpath: undefined },  { path: '/r/e/a/l/l/y/-',    mode: '40755',    type: 'Directory',    depth: 7,    linkpath: undefined },  { path: '/r/e/a/l/l/y/-/d',    mode: '40755',    type: 'Directory',    depth: 8,    linkpath: undefined },  { path: '/r/e/a/l/l/y/-/d/e',    mode: '40755',    type: 'Directory',    depth: 9,    linkpath: undefined },  { path: '/r/e/a/l/l/y/-/d/e/e',    mode: '40755',    type: 'Directory',    depth: 10,    linkpath: undefined },  { path: '/r/e/a/l/l/y/-/d/e/e/p',    mode: '40755',    type: 'Directory',    depth: 11,    linkpath: undefined },  { path: '/r/e/a/l/l/y/-/d/e/e/p/-',    mode: '40755',    type: 'Directory',    depth: 12,    linkpath: undefined },  { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f',    mode: '40755',    type: 'Directory',    depth: 13,    linkpath: undefined },  { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o',    mode: '40755',    type: 'Directory',    depth: 14,    linkpath: undefined },  { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l',    mode: '40755',    type: 'Directory',    depth: 15,    linkpath: undefined },  { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d',    mode: '40755',    type: 'Directory',    depth: 16,    linkpath: undefined },  { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e',    mode: '40755',    type: 'Directory',    depth: 17,    linkpath: undefined },  { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r',    mode: '40755',    type: 'Directory',    depth: 18,    linkpath: undefined },  { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-',    mode: '40755',    type: 'Directory',    depth: 19,    linkpath: undefined },  { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p',    mode: '40755',    type: 'Directory',    depth: 20,    linkpath: undefined },  { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a',    mode: '40755',    type: 'Directory',    depth: 21,    linkpath: undefined },  { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t',    mode: '40755',    type: 'Directory',    depth: 22,    linkpath: undefined },  { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h',    mode: '40755',    type: 'Directory',    depth: 23,    linkpath: undefined },  { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',    mode: '100644',    type: 'File',    depth: 24,    size: 100,    linkpath: undefined,    nlink: 1 },  { path: '/Ω.txt',    mode: '100644',    type: 'File',    depth: 1,    size: 2,    linkpath: undefined,    nlink: 1 } ]// The extract class basically just pipes the input// to a Reader, and then to a fstream.DirWriter// So, this is as much a test of fstream.Reader and fstream.Writer// as it is of tar.Extract, but it sort of makes sense.tap.test("preclean", function (t) {  require("rimraf").sync(__dirname + "/tmp/extract-test")  t.pass("cleaned!")  t.end()})tap.test("extract test", function (t) {  var extract = tar.Extract(target)  var inp = fs.createReadStream(file)  // give it a weird buffer size to try to break in odd places  inp.bufferSize = 1234  inp.pipe(extract)  extract.on("end", function () {    t.equal(ee, expectEntries.length, "should see "+ee+" entries")    // should get no more entries after end    extract.removeAllListeners("entry")    extract.on("entry", function (e) {      t.fail("Should not get entries after end!")    })    next()  })  extract.on("entry", function (entry) {    var found =      { path: entry.path      , mode: entry.props.mode.toString(8)      , type: entry.props.type      , depth: entry.props.depth      , size: entry.props.size      , linkpath: entry.props.linkpath      , nlink: entry.props.nlink      , dev: entry.props.dev      , ino: entry.props.ino      }    var wanted = expectEntries[ee ++]    t.equivalent(found, wanted, "tar entry " + ee + " " + wanted.path)  })  function next () {    var r = fstream.Reader({ path: target                           , type: "Directory"                           // this is just to encourage consistency                           , sort: "alpha" })    r.on("ready", function () {      foundEntry(r)    })    r.on("end", finish)    function foundEntry (entry) {      var p = entry.path.substr(target.length)      var found =        { path: p        , mode: entry.props.mode.toString(8)        , type: entry.props.type        , depth: entry.props.depth        , size: entry.props.size        , linkpath: entry.props.linkpath        , nlink: entry.props.nlink        }      var wanted = expectFiles[ef ++]      t.has(found, wanted, "unpacked file " + ef + " " + wanted.path)      entry.on("entry", foundEntry)    }    function finish () {      t.equal(ef, expectFiles.length, "should have "+ef+" items")      t.end()    }  }})
 |