|
|
|
// just a little pre-run script to set up the fixtures.
|
|
|
|
// zz-finish cleans it up
|
|
|
|
|
|
|
|
var mkdirp = require("mkdirp")
|
|
|
|
var path = require("path")
|
|
|
|
var i = 0
|
|
|
|
var 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 possible
|
|
|
|
if (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
|
|
|
|
}
|