diff options
Diffstat (limited to 'script/async/scanfiles.lua')
-rw-r--r-- | script/async/scanfiles.lua | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/script/async/scanfiles.lua b/script/async/scanfiles.lua new file mode 100644 index 00000000..f5249c8e --- /dev/null +++ b/script/async/scanfiles.lua @@ -0,0 +1,55 @@ +local args = ... + +require 'utility' +local fs = require 'bee.filesystem' +local glob = require 'glob' + +local function scan(mode, root, pattern, options) + OUT:push('log', 'Scanning:', root:string()) + OUT:push('log', 'Scan pattern:', table.dump(pattern)) + OUT:push('log', 'Scan options:', table.dump(options)) + local session = glob.gitignore(pattern, options) + + session:setInterface('type', function (path) + local fullpath = root / path + if not fs.exists(fullpath) then + return nil + end + if fs.is_directory(fullpath) then + return 'directory' + else + return 'file' + end + return nil + end) + session:setInterface('list', function (path) + local fullpath = root / path + if not fs.exists(fullpath) then + return nil + end + local list = {} + for child in fullpath:list_directory() do + list[#list+1] = child:string() + end + return list + end) + + session:scan(function (path) + local ok, msg = IN:pop() + if ok and msg == 'stop' then + OUT:push 'stop' + return + end + OUT:push(mode, fs.absolute(root / path):string()) + end) +end + +for _, data in ipairs(args) do + local root = fs.path(data.root) + local suc, err = xpcall(scan, debug.traceback, data.mode, root, data.pattern, data.options) + if not suc then + ERR:push(err) + end +end + +OUT:push 'ok' |