From 863983202ce4ef92d9e3a296a682535d157c245d Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Sat, 23 Jun 2018 17:22:23 -0700 Subject: Fixed up nomsupath behavior and refactored file stuff into its own file. --- files.lua | 125 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 files.lua (limited to 'files.lua') diff --git a/files.lua b/files.lua new file mode 100644 index 0000000..77bdf6d --- /dev/null +++ b/files.lua @@ -0,0 +1,125 @@ +local files = { } +local _FILE_CACHE = { } +files.spoof = function(filename, contents) + _FILE_CACHE[filename] = contents +end +files.read = function(filename) + do + local file_contents = _FILE_CACHE[filename] + if file_contents then + return file_contents + end + end + local file = io.open(filename) + if package.nomsupath and not file then + for nomsupath in package.nomsupath:gmatch("[^;]+") do + file = io.open(nomsupath .. "/" .. filename) + if file then + break + end + end + end + if not (file) then + return nil + end + local contents = file:read("*a") + file:close() + _FILE_CACHE[filename] = contents + return contents +end +local iterate_single +iterate_single = function(item, prev) + if item == prev then + return nil + else + return item + end +end +local match, sub, rep, gsub, format, byte, find +do + local _obj_0 = string + match, sub, rep, gsub, format, byte, match, find = _obj_0.match, _obj_0.sub, _obj_0.rep, _obj_0.gsub, _obj_0.format, _obj_0.byte, _obj_0.match, _obj_0.find +end +iterate_single = function(item, prev) + if item == prev then + return nil + else + return item + end +end +local ok, lfs = pcall(require, "lfs") +if ok then + files.walk = function(path) + local browse + browse = function(filename) + local file_type = lfs.attributes(filename, 'mode') + if file_type == 'file' then + if match(filename, "%.nom$") or match(filename, "%.lua$") then + coroutine.yield(filename) + return true + end + elseif file_type == 'directory' then + for subfile in lfs.dir(filename) do + if not (subfile == "." or subfile == "..") then + browse(filename .. "/" .. subfile) + end + end + return true + elseif file_type == 'char device' then + coroutine.yield(filename) + return true + end + return false + end + return coroutine.wrap(function() + if not browse(path) and package.nomsupath then + for nomsupath in package.nomsupath:gmatch("[^;]+") do + if browse(nomsupath .. "/" .. path) then + break + end + end + end + return nil + end) + end +else + local ret = os.execute('find . -maxdepth 0') + if not (ret == true or ret == 0) then + error("Could not find 'luafilesystem' module and couldn't run system command `find` (this might happen on Windows). Please install `luafilesystem` (which can be found at: http://keplerproject.github.io/luafilesystem/ or `luarocks install luafilesystem`)", 0) + end + files.walk = function(path) + if match(path, "%.nom$") or match(path, "%.lua$") or match(path, "^/dev/fd/[012]$") then + return iterate_single, path + end + path = gsub(path, "\\", "\\\\") + path = gsub(path, "`", "") + path = gsub(path, '"', '\\"') + path = gsub(path, "$", "") + return coroutine.wrap(function() + local f = io.popen('find -L "' .. path .. '" -not -path "*/\\.*" -type f -name "*.nom"') + local found = false + for line in f:lines() do + found = true + coroutine.yield(line) + end + if not found and package.nomsupath then + f:close() + for nomsupath in package.nomsupath:gmatch("[^;]+") do + f = io.popen('find -L "' .. package.nomsupath .. '/' .. path .. '" -not -path "*/\\.*" -type f -name "*.nom"') + for line in f:lines() do + found = true + coroutine.yield(line) + end + f:close() + if found then + break + end + end + end + if not (found) then + return error("Invalid file path: " .. tostring(path)) + end + end) + end +end +return files -- cgit v1.2.3