63 lines
1.4 KiB
Plaintext
63 lines
1.4 KiB
Plaintext
var fd = this
|
|
var wildstar = use('wildstar')
|
|
|
|
// Helper to join paths
|
|
function join_paths(base, rel) {
|
|
base = base.replace(/\/+$/, "")
|
|
rel = rel.replace(/^\/+/, "")
|
|
if (!base) return rel
|
|
if (!rel) return base
|
|
return base + "/" + rel
|
|
}
|
|
|
|
fd.globfs = function(globs, dir) {
|
|
if (dir == null) dir = "."
|
|
var results = []
|
|
|
|
function check_neg(path) {
|
|
for (var g of globs) {
|
|
if (g.startsWith("!") && wildstar.match(g.substring(1), path, wildstar.WM_WILDSTAR)) return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function check_pos(path) {
|
|
for (var g of globs) {
|
|
if (!g.startsWith("!") && wildstar.match(g, path, wildstar.WM_WILDSTAR)) return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function visit(curr_full, rel_prefix) {
|
|
if (rel_prefix && check_neg(rel_prefix)) return
|
|
|
|
var list = fd.readdir(curr_full)
|
|
if (!list) return
|
|
|
|
for (var item of list) {
|
|
var item_rel = rel_prefix ? rel_prefix + "/" + item : item
|
|
|
|
var child_full = join_paths(curr_full, item)
|
|
var st = fd.stat(child_full)
|
|
|
|
if (st.isDirectory) {
|
|
if (!check_neg(item_rel)) {
|
|
visit(child_full, item_rel)
|
|
}
|
|
} else {
|
|
if (!check_neg(item_rel) && check_pos(item_rel)) {
|
|
results.push(item_rel)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
var st = fd.stat(dir)
|
|
if (st && st.isDirectory) {
|
|
visit(dir, "")
|
|
}
|
|
|
|
return results
|
|
}
|
|
|
|
return fd |