if os.getenv "installcheck" == nil then
-- Unless we're running inside `make installcheck`, add the dev-tree
-- directories to the module search paths.
local std = require "specl.std"
local top_srcdir = os.getenv "top_srcdir" or "."
local top_builddir = os.getenv "top_builddir" or "."
package.path = std.package.normalize (
top_builddir .. "/lib/?.lua",
top_srcdir .. "/lib/?.lua",
top_builddir .. "/lib/?/init.lua",
top_srcdir .. "/lib/?/init.lua",
package.path)
package.cpath = std.package.normalize (
top_builddir .. "/ext/posix/.libs/?.so",
top_srcdir .. "/ext/posix/.libs/?.so",
top_builddir .. "/ext/posix/_libs/?.dll",
top_srcdir .. "/ext/posix/_libs/?.dll",
package.cpath)
end
local bit = require "bit32"
band, bnot, bor = bit.band, bit.bnot, bit.bor
badargs = require "specl.badargs"
hell = require "specl.shell"
posix = require "posix"
-- Allow user override of LUA binary used by hell.spawn, falling
-- back to environment PATH search for "lua" if nothing else works.
local LUA = os.getenv "LUA" or "lua"
-- Easily check for std.object.type compatibility.
function prototype (o)
return (getmetatable (o) or {})._type or io.type (o) or type (o)
end
local function mkscript (code)
local f = os.tmpname ()
local h = io.open (f, "w")
h:write (code)
h:close ()
return f
end
--- Run some Lua code with the given arguments and input.
-- @string code valid Lua code
-- @tparam[opt={}] string|table arg single argument, or table of
-- arguments for the script invocation
-- @string[opt] stdin standard input contents for the script process
-- @treturn specl.shell.Process|nil status of resulting process if
-- execution was successful, otherwise nil
function luaproc (code, arg, stdin)
local f = mkscript (code)
if type (arg) ~= "table" then arg = {arg} end
local cmd = {LUA, f, unpack (arg)}
-- inject env and stdin keys separately to avoid truncating `...` in
-- cmd constructor
cmd.stdin = stdin
cmd.env = {
LUA_CPATH = package.cpath,
LUA_PATH = package.path,
LUA_INIT = "",
LUA_INIT_5_2 = ""
}
local proc = hell.spawn (cmd)
os.remove (f)
return proc
end
-- Use a consistent template for all temporary files.
TMPDIR = posix.getenv ("TMPDIR") or "/tmp"
template = TMPDIR .. "/luaposix-test-XXXXXX"
-- Allow comparison against the error message of a function call result.
function Emsg (_, msg) return msg or "" end
-- Collect stdout from a shell command, and strip surrounding whitespace.
function cmd_output (cmd)
return hell.spawn (cmd).output:gsub ("^%s+", ""):gsub ("%s+$", "")
end
local st = require "posix.sys.stat"
local stat, S_ISDIR = st.lstat, st.S_ISDIR
-- Recursively remove a temporary directory.
function rmtmp (dir)
for f in posix.files (dir) do
if f ~= "." and f ~= ".." then
local path = dir .. "/" .. f
if S_ISDIR (stat (path).st_mode) ~= 0 then
rmtmp (path)
else
os.remove (path)
end
end
end
os.remove (dir)
end
-- Create an empty file at PATH.
function touch (path) io.open (path, "w+"):close () end
-- Format a bad argument type error.
local function typeerrors (fname, i, want, field, got)
return {
badargs.format ("?", i, want, field, got), -- LuaJIT
badargs.format (fname, i, want, field, got), -- PUC-Rio
}
end
function init (M, fname)
return M[fname], function (...) return typeerrors (fname, ...) end
end