mirror of https://github.com/natnat-mc/moonbuild
rewrite wildcard, fix #1
parent
f91877089b
commit
ab77025516
@ -0,0 +1,88 @@ |
|||||||
|
import dir, attributes from require 'lfs' |
||||||
|
|
||||||
|
import gmatch, match, gsub, sub from string |
||||||
|
import insert, concat from table |
||||||
|
|
||||||
|
ls = (d) -> |
||||||
|
[f for f in dir d when f!='.' and f!='..'] |
||||||
|
|
||||||
|
lswithpath = (d) -> |
||||||
|
if d=='' |
||||||
|
return ls '.' |
||||||
|
[d..'/'..f for f in dir d when f!='.' and f!='..'] |
||||||
|
|
||||||
|
exists = (f) -> |
||||||
|
(attributes f) != nil |
||||||
|
|
||||||
|
isdir = (f) -> |
||||||
|
a = attributes f |
||||||
|
a and a.mode == 'directory' or false |
||||||
|
|
||||||
|
mtime = (f) -> |
||||||
|
a = attributes f |
||||||
|
a and a.modification |
||||||
|
|
||||||
|
matchglob = (str, glob) -> |
||||||
|
patt = '^'..(gsub (gsub glob, '%*%*', '.*'), '%*', '[^/]*')..'$' |
||||||
|
rst = if (type str)=='table' |
||||||
|
results, i = {}, 1 |
||||||
|
for s in *str |
||||||
|
rst = (match s, patt) and s |
||||||
|
results[i], i = rst, i+1 if rst |
||||||
|
results |
||||||
|
else |
||||||
|
(match str, patt) and str |
||||||
|
rst |
||||||
|
|
||||||
|
wildcard = (glob) -> |
||||||
|
parts = [part for part in gmatch glob, '[^/]+'] |
||||||
|
absolute = (sub glob, 1, 1)=='/' |
||||||
|
|
||||||
|
for i, part in ipairs parts |
||||||
|
prevpath = (absolute and '/' or '') .. concat parts, '/', 1, i-1 |
||||||
|
currpath = prevpath .. '/' .. part |
||||||
|
|
||||||
|
if match part, '%*%*.*%*%*' |
||||||
|
error "Two '**' in the same path component in a wildcard" |
||||||
|
|
||||||
|
if match part, '%*%*' |
||||||
|
prefix = match currpath, '^(.*)%*%*' |
||||||
|
suffix = (match part, '%*%*(.*)$') .. (i==#parts and '' or ('/'..concat parts, '/', i+1, #parts)) |
||||||
|
files = lswithpath prevpath |
||||||
|
|
||||||
|
results = {} |
||||||
|
for file in *files |
||||||
|
if matchglob file, currpath |
||||||
|
if i==#parts |
||||||
|
insert results, file |
||||||
|
elseif isdir file |
||||||
|
for result in *wildcard file .. '/' .. concat parts, '/', i+1, #parts |
||||||
|
insert results, result |
||||||
|
if (matchglob file, prefix..'**') and isdir file |
||||||
|
for result in *wildcard file .. '/**' .. suffix |
||||||
|
insert results, result |
||||||
|
return results |
||||||
|
|
||||||
|
if match part, '%*' |
||||||
|
files = lswithpath prevpath |
||||||
|
|
||||||
|
if i==#parts |
||||||
|
return matchglob files, glob |
||||||
|
|
||||||
|
results = {} |
||||||
|
for file in *files |
||||||
|
if (matchglob file, currpath) and isdir file |
||||||
|
for result in *wildcard file .. '/' .. concat parts, '/', i+1, #parts |
||||||
|
insert results, result |
||||||
|
return results |
||||||
|
|
||||||
|
if exists glob |
||||||
|
return {glob} |
||||||
|
else |
||||||
|
return {} |
||||||
|
|
||||||
|
{ |
||||||
|
:wildcard |
||||||
|
:exists, :isdir |
||||||
|
:mtime |
||||||
|
} |
Loading…
Reference in new issue