164 lines
4.4 KiB
Lua
164 lines
4.4 KiB
Lua
|
|
module("luarocks.validate", package.seeall)
|
|
|
|
local fs = require("luarocks.fs")
|
|
local dir = require("luarocks.dir")
|
|
local path = require("luarocks.path")
|
|
local cfg = require("luarocks.cfg")
|
|
local build = require("luarocks.build")
|
|
local install = require("luarocks.install")
|
|
local util = require("luarocks.util")
|
|
|
|
help_summary = "Sandboxed test of build/install of all packages in a repository."
|
|
|
|
help = [[
|
|
<argument>, if given, is a local repository pathname.
|
|
]]
|
|
|
|
local function save_settings(repo)
|
|
local protocol, path = dir.split_url(repo)
|
|
table.insert(cfg.rocks_servers, 1, protocol.."://"..path)
|
|
return {
|
|
root_dir = cfg.root_dir,
|
|
rocks_dir = cfg.rocks_dir,
|
|
deploy_bin_dir = cfg.deploy_bin_dir,
|
|
deploy_lua_dir = cfg.deploy_lua_dir,
|
|
deploy_lib_dir = cfg.deploy_lib_dir,
|
|
}
|
|
end
|
|
|
|
local function restore_settings(settings)
|
|
cfg.root_dir = settings.root_dir
|
|
cfg.rocks_dir = settings.rocks_dir
|
|
cfg.deploy_bin_dir = settings.deploy_bin_dir
|
|
cfg.deploy_lua_dir = settings.deploy_lua_dir
|
|
cfg.deploy_lib_dir = settings.deploy_lib_dir
|
|
cfg.variables.ROCKS_TREE = settings.rocks_dir
|
|
cfg.variables.SCRIPTS_DIR = settings.deploy_bin_dir
|
|
table.remove(cfg.rocks_servers, 1)
|
|
end
|
|
|
|
local function prepare_sandbox(file)
|
|
local root_dir = fs.make_temp_dir(file):gsub("/+$", "")
|
|
cfg.root_dir = root_dir
|
|
cfg.rocks_dir = path.rocks_dir(root_dir)
|
|
cfg.deploy_bin_dir = path.deploy_bin_dir(root_dir)
|
|
cfg.variables.ROCKS_TREE = cfg.rocks_dir
|
|
cfg.variables.SCRIPTS_DIR = cfg.deploy_bin_dir
|
|
return root_dir
|
|
end
|
|
|
|
local function validate_rockspec(file)
|
|
local ok, err, errcode = build.build_rockspec(file, true)
|
|
if not ok then
|
|
print(err)
|
|
end
|
|
return ok, err, errcode
|
|
end
|
|
|
|
local function validate_src_rock(file)
|
|
local ok, err, errcode = build.build_rock(file, false)
|
|
if not ok then
|
|
print(err)
|
|
end
|
|
return ok, err, errcode
|
|
end
|
|
|
|
local function validate_rock(file)
|
|
local ok, err, errcode = install.install_binary_rock(file)
|
|
if not ok then
|
|
print(err)
|
|
end
|
|
return ok, err, errcode
|
|
end
|
|
|
|
local function validate(repo, flags)
|
|
local results = {
|
|
ok = {}
|
|
}
|
|
local settings = save_settings(repo)
|
|
local sandbox
|
|
if flags["quick"] then
|
|
sandbox = prepare_sandbox("luarocks_validate")
|
|
end
|
|
if not fs.exists(repo) then
|
|
return nil, repo.." is not a local repository."
|
|
end
|
|
for _, file in pairs(fs.list_dir(repo)) do for _=1,1 do
|
|
if file == "manifest" or file == "index.html" then
|
|
break -- continue for
|
|
end
|
|
local pathname = fs.absolute_name(dir.path(repo, file))
|
|
if not flags["quick"] then
|
|
sandbox = prepare_sandbox(file)
|
|
end
|
|
local ok, err, errcode
|
|
print()
|
|
print("Verifying "..pathname)
|
|
if file:match("%.rockspec$") then
|
|
ok, err, errcode = validate_rockspec(pathname)
|
|
elseif file:match("%.src%.rock$") then
|
|
ok, err, errcode = validate_src_rock(pathname)
|
|
elseif file:match("%.rock$") then
|
|
ok, err, errcode = validate_rock(pathname)
|
|
end
|
|
if ok then
|
|
table.insert(results.ok, {file=file} )
|
|
else
|
|
if not errcode then
|
|
errcode = "misc"
|
|
end
|
|
if not results[errcode] then
|
|
results[errcode] = {}
|
|
end
|
|
table.insert(results[errcode], {file=file, err=err} )
|
|
end
|
|
util.run_scheduled_functions()
|
|
if not flags["quick"] then
|
|
fs.delete(sandbox)
|
|
end
|
|
repeat until not fs.pop_dir()
|
|
end end
|
|
if flags["quick"] then
|
|
fs.delete(sandbox)
|
|
end
|
|
restore_settings(settings)
|
|
print()
|
|
print("Results:")
|
|
print("--------")
|
|
print("OK: "..tostring(#results.ok))
|
|
for _, entry in ipairs(results.ok) do
|
|
print(entry.file)
|
|
end
|
|
for errcode, errors in pairs(results) do
|
|
if errcode ~= "ok" then
|
|
print()
|
|
print(errcode.." errors: "..tostring(#errors))
|
|
for _, entry in ipairs(errors) do
|
|
print(entry.file, entry.err)
|
|
end
|
|
end
|
|
end
|
|
|
|
print()
|
|
print("Summary:")
|
|
print("--------")
|
|
local total = 0
|
|
for errcode, errors in pairs(results) do
|
|
print(errcode..": "..tostring(#errors))
|
|
total = total + #errors
|
|
end
|
|
print("Total: "..total)
|
|
return true
|
|
end
|
|
|
|
function run(...)
|
|
local flags, repo = util.parse_flags(...)
|
|
repo = repo or cfg.rocks_dir
|
|
|
|
print("Verifying contents of "..repo)
|
|
|
|
return validate(repo, flags)
|
|
end
|
|
|