| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 | // just a little pre-run script to set up the fixtures.// zz-finish cleans it upvar mkdirp = require("mkdirp")var path = require("path")var i = 0var tap = require("tap")var fs = require("fs")var rimraf = require("rimraf")var files =[ "a/.abcdef/x/y/z/a", "a/abcdef/g/h", "a/abcfed/g/h", "a/b/c/d", "a/bc/e/f", "a/c/d/c/b", "a/cb/e/f"]var symlinkTo = path.resolve(__dirname, "a/symlink/a/b/c")var symlinkFrom = "../.."files = files.map(function (f) {  return path.resolve(__dirname, f)})tap.test("remove fixtures", function (t) {  rimraf(path.resolve(__dirname, "a"), function (er) {    t.ifError(er, "remove fixtures")    t.end()  })})files.forEach(function (f) {  tap.test(f, function (t) {    var d = path.dirname(f)    mkdirp(d, 0755, function (er) {      if (er) {        t.fail(er)        return t.bailout()      }      fs.writeFile(f, "i like tests", function (er) {        t.ifError(er, "make file")        t.end()      })    })  })})if (process.platform !== "win32") {  tap.test("symlinky", function (t) {    var d = path.dirname(symlinkTo)    console.error("mkdirp", d)    mkdirp(d, 0755, function (er) {      t.ifError(er)      fs.symlink(symlinkFrom, symlinkTo, "dir", function (er) {        t.ifError(er, "make symlink")        t.end()      })    })  })};["foo","bar","baz","asdf","quux","qwer","rewq"].forEach(function (w) {  w = "/tmp/glob-test/" + w  tap.test("create " + w, function (t) {    mkdirp(w, function (er) {      if (er)        throw er      t.pass(w)      t.end()    })  })})// generate the bash pattern test-fixtures if possibleif (process.platform === "win32" || !process.env.TEST_REGEN) {  console.error("Windows, or TEST_REGEN unset.  Using cached fixtures.")  return}var spawn = require("child_process").spawn;var globs =  // put more patterns here.  // anything that would be directly in / should be in /tmp/glob-test  ["test/a/*/+(c|g)/./d"  ,"test/a/**/[cg]/../[cg]"  ,"test/a/{b,c,d,e,f}/**/g"  ,"test/a/b/**"  ,"test/**/g"  ,"test/a/abc{fed,def}/g/h"  ,"test/a/abc{fed/g,def}/**/"  ,"test/a/abc{fed/g,def}/**///**/"  ,"test/**/a/**/"  ,"test/+(a|b|c)/a{/,bc*}/**"  ,"test/*/*/*/f"  ,"test/**/f"  ,"test/a/symlink/a/b/c/a/b/c/a/b/c//a/b/c////a/b/c/**/b/c/**"  ,"{./*/*,/tmp/glob-test/*}"  ,"{/tmp/glob-test/*,*}" // evil owl face!  how you taunt me!  ,"test/a/!(symlink)/**"  ]var bashOutput = {}var fs = require("fs")globs.forEach(function (pattern) {  tap.test("generate fixture " + pattern, function (t) {    var cmd = "shopt -s globstar && " +              "shopt -s extglob && " +              "shopt -s nullglob && " +              // "shopt >&2; " +              "eval \'for i in " + pattern + "; do echo $i; done\'"    var cp = spawn("bash", ["-c", cmd], { cwd: path.dirname(__dirname) })    var out = []    cp.stdout.on("data", function (c) {      out.push(c)    })    cp.stderr.pipe(process.stderr)    cp.on("close", function (code) {      out = flatten(out)      if (!out)        out = []      else        out = cleanResults(out.split(/\r*\n/))      bashOutput[pattern] = out      t.notOk(code, "bash test should finish nicely")      t.end()    })  })})tap.test("save fixtures", function (t) {  var fname = path.resolve(__dirname, "bash-results.json")  var data = JSON.stringify(bashOutput, null, 2) + "\n"  fs.writeFile(fname, data, function (er) {    t.ifError(er)    t.end()  })})function cleanResults (m) {  // normalize discrepancies in ordering, duplication,  // and ending slashes.  return m.map(function (m) {    return m.replace(/\/+/g, "/").replace(/\/$/, "")  }).sort(alphasort).reduce(function (set, f) {    if (f !== set[set.length - 1]) set.push(f)    return set  }, []).sort(alphasort).map(function (f) {    // de-windows    return (process.platform !== 'win32') ? f           : f.replace(/^[a-zA-Z]:\\\\/, '/').replace(/\\/g, '/')  })}function flatten (chunks) {  var s = 0  chunks.forEach(function (c) { s += c.length })  var out = new Buffer(s)  s = 0  chunks.forEach(function (c) {    c.copy(out, s)    s += c.length  })  return out.toString().trim()}function alphasort (a, b) {  a = a.toLowerCase()  b = b.toLowerCase()  return a > b ? 1 : a < b ? -1 : 0}
 |