99 lines
2.1 KiB
Plaintext
99 lines
2.1 KiB
Plaintext
var fd = this
|
|
var wildstar = use('wildstar')
|
|
|
|
function last_pos(str, sep) {
|
|
var last = null
|
|
replace(str, sep, function(m, pos) {
|
|
last = pos
|
|
return m
|
|
})
|
|
return last
|
|
}
|
|
|
|
// Helper to join paths
|
|
function join_paths(base, rel) {
|
|
base = replace(base, /\/+$/, "")
|
|
rel = replace(rel, /^\/+/, "")
|
|
if (!base) return rel
|
|
if (!rel) return base
|
|
return base + "/" + rel
|
|
}
|
|
|
|
fd.join_paths = join_paths
|
|
fd.basename = function basename(path) {
|
|
var last = last_pos(path, '/')
|
|
if (last == null) return path
|
|
return text(path, last+1)
|
|
}
|
|
|
|
fd.dirname = function dirname(path) {
|
|
var last = last_pos(path, '/')
|
|
if (last == null) return ""
|
|
return text(path,0,last)
|
|
}
|
|
|
|
fd.stem = function stem(path) {
|
|
var last = last_pos(path, '.')
|
|
if (last == null) return path
|
|
return text(path,0,last)
|
|
}
|
|
|
|
fd.globfs = function(globs, dir) {
|
|
if (dir == null) dir = "."
|
|
var results = []
|
|
|
|
function check_neg(path) {
|
|
var found = false;
|
|
arrfor(globs, function(g) {
|
|
if (starts_with(g, "!") && wildstar.match(text(g, 1), path, wildstar.WM_WILDSTAR)) {
|
|
found = true;
|
|
return true;
|
|
}
|
|
}, null, true);
|
|
return found;
|
|
}
|
|
|
|
function check_pos(path) {
|
|
var found = false;
|
|
arrfor(globs, function(g) {
|
|
if (!starts_with(g, "!") && wildstar.match(g, path, wildstar.WM_WILDSTAR)) {
|
|
found = true;
|
|
return true;
|
|
}
|
|
}, null, true);
|
|
return found;
|
|
}
|
|
|
|
function visit(curr_full, rel_prefix) {
|
|
if (rel_prefix && check_neg(rel_prefix)) return
|
|
|
|
var list = fd.readdir(curr_full)
|
|
if (!list) return
|
|
|
|
arrfor(list, function(item) {
|
|
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)) {
|
|
push(results, item_rel)
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
var st = fd.stat(dir)
|
|
if (st && st.isDirectory) {
|
|
visit(dir, "")
|
|
}
|
|
|
|
return results
|
|
}
|
|
|
|
return fd |