From e7f9680bd66191b575e10ec2c9231bfff30694b7 Mon Sep 17 00:00:00 2001 From: Hisham Muhammad Date: Mon, 12 Jan 2015 17:41:56 -0200 Subject: Error out on bad config files. Alternative implementation to the one given by @Tieske, following discussion in #260. Closes #260. Closes #228. --- src/luarocks/cfg.lua | 27 ++++++++++++--------- src/luarocks/persist.lua | 63 ++++++++++++++++++++++++++++++------------------ 2 files changed, 54 insertions(+), 36 deletions(-) (limited to 'src') diff --git a/src/luarocks/cfg.lua b/src/luarocks/cfg.lua index 2d02230b..32ab1f37 100644 --- a/src/luarocks/cfg.lua +++ b/src/luarocks/cfg.lua @@ -44,6 +44,7 @@ cfg.errorcodes = setmetatable({ OK = 0, UNSPECIFIED = 1, PERMISSIONDENIED = 2, + CONFIGFILE = 3, CRASH = 99 },{ __index = function(t, key) @@ -145,28 +146,29 @@ cfg.variables = {} cfg.rocks_trees = {} sys_config_file = site_config.LUAROCKS_SYSCONFIG or sys_config_dir.."/config-"..cfg.lua_version..".lua" -local err -sys_config_ok, err = persist.load_into_table(sys_config_file, cfg) +local err, errcode +sys_config_ok, err, errcode = persist.load_into_table(sys_config_file, cfg) -if not sys_config_ok then +if (not sys_config_ok) and errcode ~= "run" then sys_config_file = sys_config_dir.."/config.lua" - sys_config_ok, err = persist.load_into_table(sys_config_file, cfg) + sys_config_ok, err, errcode = persist.load_into_table(sys_config_file, cfg) end -if err and sys_config_ok == nil then +if (not sys_config_ok) and errcode ~= "open" then io.stderr:write(err.."\n") + os.exit(cfg.errorcodes.CONFIGFILE) end if not site_config.LUAROCKS_FORCE_CONFIG then - local home_overrides, err + local home_overrides, err, errcode home_config_file = os.getenv("LUAROCKS_CONFIG_" .. version_suffix) or os.getenv("LUAROCKS_CONFIG") if home_config_file then - home_overrides, err = persist.load_into_table(home_config_file, { home = cfg.home, lua_version = cfg.lua_version }) + home_overrides, err, errcode = persist.load_into_table(home_config_file, { home = cfg.home, lua_version = cfg.lua_version }) else home_config_file = home_config_dir.."/config-"..cfg.lua_version..".lua" - home_overrides, err = persist.load_into_table(home_config_file, { home = cfg.home, lua_version = cfg.lua_version }) - if not home_overrides then + home_overrides, err, errcode = persist.load_into_table(home_config_file, { home = cfg.home, lua_version = cfg.lua_version }) + if (not home_overrides) and (not errcode == "run") then home_config_file = home_config_dir.."/config.lua" - home_overrides, err = persist.load_into_table(home_config_file, { home = cfg.home, lua_version = cfg.lua_version }) + home_overrides, err, errcode = persist.load_into_table(home_config_file, { home = cfg.home, lua_version = cfg.lua_version }) end end if home_overrides then @@ -178,10 +180,11 @@ if not site_config.LUAROCKS_FORCE_CONFIG then cfg.rocks_servers = nil end util.deep_merge(cfg, home_overrides) - else -- nil or false + else home_config_ok = home_overrides - if err and home_config_ok == nil then + if errcode ~= "open" then io.stderr:write(err.."\n") + os.exit(cfg.errorcodes.CONFIGFILE) end end end diff --git a/src/luarocks/persist.lua b/src/luarocks/persist.lua index 9d601a43..87db96b2 100644 --- a/src/luarocks/persist.lua +++ b/src/luarocks/persist.lua @@ -9,18 +9,48 @@ package.loaded["luarocks.persist"] = persist local util = require("luarocks.util") +local function run_file(filename, env) + local fd, err, errno = io.open(filename) + if not fd then + return nil, err, "open" + end + local str = fd:read("*a"):gsub("^#![^\n]*\n", "") + fd:close() + local chunk, ran + if _VERSION == "Lua 5.1" then -- Lua 5.1 + chunk, err = loadstring(str, filename) + if chunk then + setfenv(chunk, env) + ran, err = pcall(chunk) + end + else -- Lua 5.2 + chunk, err = loadfile(filename, "t", env) + if chunk then + ran, err = pcall(chunk) + end + end + if not chunk then + return nil, "Error loading file: "..err, "load" + end + if not ran then + return nil, "Error running file: "..err, "run" + end + return true, err +end + --- Load a Lua file containing assignments, storing them in a table. -- The global environment is not propagated to the loaded file. -- @param filename string: the name of the file. -- @param tbl table or nil: if given, this table is used to store -- loaded values. --- @return table or (nil, string): a table with the file's assignments --- as fields, or nil and a message in case of errors. +-- @return table or (nil, string, string): a table with the file's assignments +-- as fields, or nil, an error message and an error code ("load" or "run") +-- in case of errors. function persist.load_into_table(filename, tbl) assert(type(filename) == "string") assert(type(tbl) == "table" or not tbl) - local result, chunk, ran, err + local result, ok, err result = tbl or {} local globals = {} local globals_mt = { @@ -31,28 +61,13 @@ function persist.load_into_table(filename, tbl) } local save_mt = getmetatable(result) setmetatable(result, globals_mt) - if _VERSION == "Lua 5.1" then -- Lua 5.1 - chunk, err = loadfile(filename) - if chunk then - setfenv(chunk, result) - ran, err = pcall(chunk) - end - else -- Lua 5.2 - chunk, err = loadfile(filename, "t", result) - if chunk then - ran, err = pcall(chunk) - end - end - setmetatable(result, save_mt) - if not chunk then - if err:sub(1,5) ~= filename:sub(1,5) then - return false, err - end - return nil, "Error loading file: "..err - end - if not ran then - return nil, "Error running file: "..err + ok, err, errcode = run_file(filename, result) + + setmetatable(result, save_mt) + + if not ok then + return nil, err, errcode end return result, globals end -- cgit v1.2.3-55-g6feb