text: // the symlink file is excluded from git, because it makes
  // windows freak the hell out.
  var fs = require("fs")
      , path = require("path")
      , symlink = path.resolve(__dirname, "fixtures/symlink")
  try {
      fs.unlinkSync(symlink)
  } catch (e) {
  }
  fs.symlinkSync("./hardlink-1", symlink)
  process.on("exit", function () {
      fs.unlinkSync(symlink)
  })
  
  var tap = require("tap")
      , tar = require("../tar.js")
      , pkg = require("../package.json")
      , Pack = tar.Pack
      , fstream = require("fstream")
      , Reader = fstream.Reader
      , Writer = fstream.Writer
      , input = path.resolve(__dirname, "fixtures/")
      , target = path.resolve(__dirname, "tmp/pack.tar")
      , uid = process.getuid ? process.getuid() : 0
      , gid = process.getgid ? process.getgid() : 0
  
      , entries =
  
      // the global header and root fixtures/ dir are going to get
      // a different date each time, so omit that bit.
      // Also, dev/ino values differ across machines, so that's not
      // included.
      [['globalExtendedHeader',
          {
              path: 'PaxHeader/',
              mode: 438,
              uid: 0,
              gid: 0,
              type: 'g',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          },
          {
              "NODETAR.author": pkg.author,
              "NODETAR.name": pkg.name,
              "NODETAR.description": pkg.description,
              "NODETAR.version": pkg.version,
              "NODETAR.repository.type": pkg.repository.type,
              "NODETAR.repository.url": pkg.repository.url,
              "NODETAR.main": pkg.main,
              "NODETAR.scripts.test": pkg.scripts.test
          }]
  
          , ['entry',
          {
              path: 'fixtures/',
              mode: 493,
              uid: uid,
              gid: gid,
              size: 0,
              type: '5',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['extendedHeader',
          {
              path: 'PaxHeader/fixtures/200cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
              mode: 420,
              uid: uid,
              gid: gid,
              type: 'x',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          },
          {
              path: 'fixtures/200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
              'NODETAR.depth': '1',
              'NODETAR.type': 'File',
              nlink: 1,
              uid: uid,
              gid: gid,
              size: 200,
              'NODETAR.blksize': '4096',
              'NODETAR.blocks': '8'
          }]
  
          , ['entry',
          {
              path: 'fixtures/200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
              mode: 420,
              uid: uid,
              gid: gid,
              size: 200,
              type: '0',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: '',
              'NODETAR.depth': '1',
              'NODETAR.type': 'File',
              nlink: 1,
              'NODETAR.blksize': '4096',
              'NODETAR.blocks': '8'
          }]
  
          , ['entry',
          {
              path: 'fixtures/a.txt',
              mode: 420,
              uid: uid,
              gid: gid,
              size: 257,
              type: '0',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['entry',
          {
              path: 'fixtures/b.txt',
              mode: 420,
              uid: uid,
              gid: gid,
              size: 512,
              type: '0',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['entry',
          {
              path: 'fixtures/c.txt',
              mode: 420,
              uid: uid,
              gid: gid,
              size: 513,
              type: '0',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['entry',
          {
              path: 'fixtures/cc.txt',
              mode: 420,
              uid: uid,
              gid: gid,
              size: 513,
              type: '0',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['entry',
          {
              path: 'fixtures/foo.js',
              mode: 420,
              uid: uid,
              gid: gid,
              size: 4,
              type: '0',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['entry',
          {
              path: 'fixtures/hardlink-1',
              mode: 420,
              uid: uid,
              gid: gid,
              size: 200,
              type: '0',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['entry',
          {
              path: 'fixtures/hardlink-2',
              mode: 420,
              uid: uid,
              gid: gid,
              size: 0,
              type: '1',
              linkpath: 'fixtures/hardlink-1',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['entry',
          {
              path: 'fixtures/omega.txt',
              mode: 420,
              uid: uid,
              gid: gid,
              size: 2,
              type: '0',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['entry',
          {
              path: 'fixtures/packtest/',
              mode: 493,
              uid: uid,
              gid: gid,
              size: 0,
              type: '5',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['entry',
          {
              path: 'fixtures/packtest/omega.txt',
              mode: 420,
              uid: uid,
              gid: gid,
              size: 2,
              type: '0',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['entry',
          {
              path: 'fixtures/packtest/star.4.html',
              mode: 420,
              uid: uid,
              gid: gid,
              size: 54081,
              type: '0',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['extendedHeader',
          {
              path: 'PaxHeader/fixtures/packtest/Ω.txt',
              mode: 420,
              uid: uid,
              gid: gid,
              type: 'x',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          },
          {
              path: 'fixtures/packtest/Ω.txt',
              'NODETAR.depth': '2',
              'NODETAR.type': 'File',
              nlink: 1,
              uid: uid,
              gid: gid,
              size: 2,
              'NODETAR.blksize': '4096',
              'NODETAR.blocks': '8'
          }]
  
          , ['entry',
          {
              path: 'fixtures/packtest/Ω.txt',
              mode: 420,
              uid: uid,
              gid: gid,
              size: 2,
              type: '0',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: '',
              'NODETAR.depth': '2',
              'NODETAR.type': 'File',
              nlink: 1,
              'NODETAR.blksize': '4096',
              'NODETAR.blocks': '8'
          }]
  
          , ['entry',
          {
              path: 'fixtures/r/',
              mode: 493,
              uid: uid,
              gid: gid,
              size: 0,
              type: '5',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['entry',
          {
              path: 'fixtures/r/e/',
              mode: 493,
              uid: uid,
              gid: gid,
              size: 0,
              type: '5',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['entry',
          {
              path: 'fixtures/r/e/a/',
              mode: 493,
              uid: uid,
              gid: gid,
              size: 0,
              type: '5',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['entry',
          {
              path: 'fixtures/r/e/a/l/',
              mode: 493,
              uid: uid,
              gid: gid,
              size: 0,
              type: '5',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['entry',
          {
              path: 'fixtures/r/e/a/l/l/',
              mode: 493,
              uid: uid,
              gid: gid,
              size: 0,
              type: '5',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['entry',
          {
              path: 'fixtures/r/e/a/l/l/y/',
              mode: 493,
              uid: uid,
              gid: gid,
              size: 0,
              type: '5',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['entry',
          {
              path: 'fixtures/r/e/a/l/l/y/-/',
              mode: 493,
              uid: uid,
              gid: gid,
              size: 0,
              type: '5',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['entry',
          {
              path: 'fixtures/r/e/a/l/l/y/-/d/',
              mode: 493,
              uid: uid,
              gid: gid,
              size: 0,
              type: '5',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['entry',
          {
              path: 'fixtures/r/e/a/l/l/y/-/d/e/',
              mode: 493,
              uid: uid,
              gid: gid,
              size: 0,
              type: '5',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['entry',
          {
              path: 'fixtures/r/e/a/l/l/y/-/d/e/e/',
              mode: 493,
              uid: uid,
              gid: gid,
              size: 0,
              type: '5',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['entry',
          {
              path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/',
              mode: 493,
              uid: uid,
              gid: gid,
              size: 0,
              type: '5',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['entry',
          {
              path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/',
              mode: 493,
              uid: uid,
              gid: gid,
              size: 0,
              type: '5',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['entry',
          {
              path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/',
              mode: 493,
              uid: uid,
              gid: gid,
              size: 0,
              type: '5',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['entry',
          {
              path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/',
              mode: 493,
              uid: uid,
              gid: gid,
              size: 0,
              type: '5',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['entry',
          {
              path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/',
              mode: 493,
              uid: uid,
              gid: gid,
              size: 0,
              type: '5',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['entry',
          {
              path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/',
              mode: 493,
              uid: uid,
              gid: gid,
              size: 0,
              type: '5',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['entry',
          {
              path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/',
              mode: 493,
              uid: uid,
              gid: gid,
              size: 0,
              type: '5',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['entry',
          {
              path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/',
              mode: 493,
              uid: uid,
              gid: gid,
              size: 0,
              type: '5',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['entry',
          {
              path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/',
              mode: 493,
              uid: uid,
              gid: gid,
              size: 0,
              type: '5',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['entry',
          {
              path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/',
              mode: 493,
              uid: uid,
              gid: gid,
              size: 0,
              type: '5',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['entry',
          {
              path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/',
              mode: 493,
              uid: uid,
              gid: gid,
              size: 0,
              type: '5',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['entry',
          {
              path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/',
              mode: 493,
              uid: uid,
              gid: gid,
              size: 0,
              type: '5',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['entry',
          {
              path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/',
              mode: 493,
              uid: uid,
              gid: gid,
              size: 0,
              type: '5',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['entry',
          {
              path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
              mode: 420,
              uid: uid,
              gid: gid,
              size: 100,
              type: '0',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['entry',
          {
              path: 'fixtures/symlink',
              uid: uid,
              gid: gid,
              size: 0,
              type: '2',
              linkpath: 'hardlink-1',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          }]
  
          , ['extendedHeader',
          {
              path: 'PaxHeader/fixtures/Ω.txt',
              mode: 420,
              uid: uid,
              gid: gid,
              type: 'x',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: ''
          },
          {
              path: "fixtures/Ω.txt"
              , "NODETAR.depth": "1"
              , "NODETAR.type": "File"
              , nlink: 1
              , uid: uid
              , gid: gid
              , size: 2
              , "NODETAR.blksize": "4096"
              , "NODETAR.blocks": "8"
          }]
  
          , ['entry',
          {
              path: 'fixtures/Ω.txt',
              mode: 420,
              uid: uid,
              gid: gid,
              size: 2,
              type: '0',
              linkpath: '',
              ustar: 'ustar\u0000',
              ustarver: '00',
              uname: '',
              gname: '',
              devmaj: 0,
              devmin: 0,
              fill: '',
              'NODETAR.depth': '1',
              'NODETAR.type': 'File',
              nlink: 1,
              'NODETAR.blksize': '4096',
              'NODETAR.blocks': '8'
          }]
      ]
  
  // first, make sure that the hardlinks are actually hardlinks, or this
  // won't work.  Git has a way of replacing them with a copy.
  var hard1 = path.resolve(__dirname, "fixtures/hardlink-1")
      , hard2 = path.resolve(__dirname, "fixtures/hardlink-2")
      , fs = require("fs")
  
  try {
      fs.unlinkSync(hard2)
  } catch (e) {
  }
  fs.linkSync(hard1, hard2)
  
  tap.test("with global header", {timeout: 10000}, function (t) {
      runTest(t, true)
  })
  
  tap.test("without global header", {timeout: 10000}, function (t) {
      runTest(t, false)
  })
  
  function alphasort(a, b) {
      return a === b ? 0
          : a.toLowerCase() > b.toLowerCase() ? 1
              : a.toLowerCase() < b.toLowerCase() ? -1
                  : a > b ? 1
                      : -1
  }
  
  function runTest(t, doGH) {
      var reader = Reader({
          path: input
          , filter: function () {
              return !this.path.match(/\.(tar|hex)$/)
          }
          , sort: alphasort
      })
  
      var pack = Pack(doGH ? pkg : null)
      var writer = Writer(target)
  
      // skip the global header if we're not doing that.
      var entry = doGH ? 0 : 1
  
      t.ok(reader, "reader ok")
      t.ok(pack, "pack ok")
      t.ok(writer, "writer ok")
  
      pack.pipe(writer)
  
      var parse = tar.Parse()
      t.ok(parse, "parser should be ok")
  
      pack.on("data", function (c) {
          // console.error("PACK DATA")
          if (c.length !== 512) {
              // this one is too noisy, only assert if it'll be relevant
              t.equal(c.length, 512, "parser should emit data in 512byte blocks")
          }
          parse.write(c)
      })
  
      pack.on("end", function () {
          // console.error("PACK END")
          t.pass("parser ends")
          parse.end()
      })
  
      pack.on("error", function (er) {
          t.fail("pack error", er)
      })
  
      parse.on("error", function (er) {
          t.fail("parse error", er)
      })
  
      writer.on("error", function (er) {
          t.fail("writer error", er)
      })
  
      reader.on("error", function (er) {
          t.fail("reader error", er)
      })
  
      parse.on("*", function (ev, e) {
          var wanted = entries[entry++]
          if (!wanted) {
              t.fail("unexpected event: " + ev)
              return
          }
          t.equal(ev, wanted[0], "event type should be " + wanted[0])
  
          // if (ev !== wanted[0] || e.path !== wanted[1].path) {
          //   console.error(wanted)
          //   console.error([ev, e.props])
          //   throw "break"
          // }
  
          t.has(e.props, wanted[1], "properties " + wanted[1].path)
          if (wanted[2]) {
              e.on("end", function () {
                  if (!e.fields) {
                      t.ok(e.fields, "should get fields")
                  } else {
                      t.has(e.fields, wanted[2], "should get expected fields")
                  }
              })
          }
      })
  
      reader.pipe(pack)
  
      writer.on("close", function () {
          t.equal(entry, entries.length, "should get all expected entries")
          t.pass("it finished")
          t.end()
      })
  
  }
  