From a55f09fae00cb3c575f926eda4d76e81ff37b2ba Mon Sep 17 00:00:00 2001 From: Hisham Muhammad Date: Tue, 19 Jun 2018 09:58:36 -0300 Subject: fs: make module loading side-effect free, require explicit init() --- spec/fetch_spec.lua | 2 + spec/fs_spec.lua | 1 + spec/test_spec.lua | 3 ++ spec/tools_spec.lua | 3 +- src/luarocks/command_line.lua | 2 + src/luarocks/core/cfg.lua | 8 ++++ src/luarocks/fs.lua | 107 +++++++++++++++++++++++------------------- src/luarocks/util.lua | 4 +- 8 files changed, 80 insertions(+), 50 deletions(-) diff --git a/spec/fetch_spec.lua b/spec/fetch_spec.lua index ce4cfb56..6e00bc22 100644 --- a/spec/fetch_spec.lua +++ b/spec/fetch_spec.lua @@ -3,6 +3,7 @@ local git_repo = require("spec.util.git_repo") test_env.unload_luarocks() test_env.setup_specs() +local fs = require("luarocks.fs") local fetch = require("luarocks.fetch") local fs = require("luarocks.fs") local path = require("luarocks.path") @@ -20,6 +21,7 @@ describe("Luarocks fetch test #unit #mock", function() local runner setup(function() + fs.init() test_env.mock_server_init() runner = require("luacov.runner") diff --git a/spec/fs_spec.lua b/spec/fs_spec.lua index 9b2aa01b..b8091f75 100644 --- a/spec/fs_spec.lua +++ b/spec/fs_spec.lua @@ -55,6 +55,7 @@ describe("Luarocks fs test #unit", function() local runner setup(function() + fs.init() runner = require("luacov.runner") runner.init(testing_paths.testrun_dir .. "/luacov.config") runner.tick = true diff --git a/spec/test_spec.lua b/spec/test_spec.lua index 0111f89a..7a2399a9 100644 --- a/spec/test_spec.lua +++ b/spec/test_spec.lua @@ -82,6 +82,7 @@ end) test_env.unload_luarocks() local fs = require("luarocks.fs") +local cfg = require("luarocks.core.cfg") local path = require("luarocks.path") local test = require("luarocks.test") local test_busted = require("luarocks.test.busted") @@ -91,6 +92,8 @@ describe("LuaRocks test #unit", function() local runner setup(function() + cfg.init() + fs.init() runner = require("luacov.runner") runner.init(testing_paths.testrun_dir .. "/luacov.config") runner.tick = true diff --git a/spec/tools_spec.lua b/spec/tools_spec.lua index 8805d703..10dafb0b 100644 --- a/spec/tools_spec.lua +++ b/spec/tools_spec.lua @@ -5,7 +5,7 @@ local write_file = test_env.write_file test_env.unload_luarocks() local fs = require("luarocks.fs") -local patch = package.loaded["luarocks.tools.patch"] +local patch = require("luarocks.tools.patch") local lao = [[The Nameless is the origin of Heaven and Earth; @@ -148,6 +148,7 @@ describe("Luarocks patch test #unit", function() local runner setup(function() + fs.init() runner = require("luacov.runner") runner.init(testing_paths.testrun_dir .. "/luacov.config") runner.tick = true diff --git a/src/luarocks/command_line.lua b/src/luarocks/command_line.lua index 5ba5ae1b..b542fb9c 100644 --- a/src/luarocks/command_line.lua +++ b/src/luarocks/command_line.lua @@ -93,6 +93,8 @@ function command_line.run_command(...) die(flags.ERROR.." See --help.") end + fs.init() + if flags["from"] then flags["server"] = flags["from"] end if flags["only-from"] then flags["only-server"] = flags["only-from"] end if flags["only-sources-from"] then flags["only-sources"] = flags["only-sources-from"] end diff --git a/src/luarocks/core/cfg.lua b/src/luarocks/core/cfg.lua index 38b10f6e..00efeaf3 100644 --- a/src/luarocks/core/cfg.lua +++ b/src/luarocks/core/cfg.lua @@ -763,4 +763,12 @@ function cfg.is_platform(query) end end +function cfg.each_platform() + local i = 0 + return function() + i = i + 1 + return cfg.platforms[i] + end +end + return cfg diff --git a/src/luarocks/fs.lua b/src/luarocks/fs.lua index 7322e552..999572b8 100644 --- a/src/luarocks/fs.lua +++ b/src/luarocks/fs.lua @@ -16,62 +16,73 @@ local cfg = require("luarocks.core.cfg") local pack = table.pack or function(...) return { n = select("#", ...), ... } end local unpack = table.unpack or unpack -local old_popen, old_exec -fs.verbose = function() -- patch io.popen and os.execute to display commands in verbose mode - if old_popen or old_exec then return end - old_popen = io.popen - io.popen = function(one, two) - if two == nil then - print("\nio.popen: ", one) - else - print("\nio.popen: ", one, "Mode:", two) - end - return old_popen(one, two) - end - - old_exec = os.execute - os.execute = function(cmd) - -- redact api keys if present - print("\nos.execute: ", (cmd:gsub("(/api/[^/]+/)([^/]+)/", function(cap, key) return cap.."/" end)) ) - local code = pack(old_exec(cmd)) - print("Results: "..tostring(code.n)) - for i = 1,code.n do - print(" "..tostring(i).." ("..type(code[i]).."): "..tostring(code[i])) - end - return unpack(code, 1, code.n) - end -end -if cfg.verbose then fs.verbose() end +do + local old_popen, old_execute + + -- patch io.popen and os.execute to display commands in verbose mode + function fs.verbose() + if old_popen or old_execute then return end + old_popen = io.popen + io.popen = function(one, two) + if two == nil then + print("\nio.popen: ", one) + else + print("\nio.popen: ", one, "Mode:", two) + end + return old_popen(one, two) + end -local function load_fns(fs_table) - for name, fn in pairs(fs_table) do - if not fs[name] then - fs[name] = fn + old_execute = os.execute + os.execute = function(cmd) + -- redact api keys if present + print("\nos.execute: ", (cmd:gsub("(/api/[^/]+/)([^/]+)/", function(cap, key) return cap.."/" end)) ) + local code = pack(old_execute(cmd)) + print("Results: "..tostring(code.n)) + for i = 1,code.n do + print(" "..tostring(i).." ("..type(code[i]).."): "..tostring(code[i])) + end + return unpack(code, 1, code.n) end end end --- Load platform-specific functions -local loaded_platform = nil -for _, platform in ipairs(cfg.platforms) do - local ok, fs_plat = pcall(require, "luarocks.fs."..platform) - if ok and fs_plat then - loaded_platform = platform - load_fns(fs_plat) - break +do + local function load_fns(fs_table) + for name, fn in pairs(fs_table) do + if not fs[name] then + fs[name] = fn + end + end end -end --- Load platform-independent pure-Lua functionality -local fs_lua = require("luarocks.fs.lua") -load_fns(fs_lua) + function fs.init() + if fs.current_dir then + -- already initialized + return + end + + -- Load platform-specific functions + local loaded_platform = nil + for platform in cfg.each_platform() do + local ok, fs_plat = pcall(require, "luarocks.fs."..platform) + if ok and fs_plat then + loaded_platform = platform + load_fns(fs_plat) + break + end + end --- Load platform-specific fallbacks for missing Lua modules -local ok, fs_plat_tools = pcall(require, "luarocks.fs."..loaded_platform..".tools") -if ok and fs_plat_tools then - load_fns(fs_plat_tools) - load_fns(require("luarocks.fs.tools")) -end + -- Load platform-independent pure-Lua functionality + local fs_lua = require("luarocks.fs.lua") + load_fns(fs_lua) + -- Load platform-specific fallbacks for missing Lua modules + local ok, fs_plat_tools = pcall(require, "luarocks.fs."..loaded_platform..".tools") + if ok and fs_plat_tools then + load_fns(fs_plat_tools) + load_fns(require("luarocks.fs.tools")) + end + end +end return fs diff --git a/src/luarocks/util.lua b/src/luarocks/util.lua index ee4a803a..8058a407 100644 --- a/src/luarocks/util.lua +++ b/src/luarocks/util.lua @@ -59,7 +59,9 @@ end -- Functions are executed in the inverse order they were scheduled. function util.run_scheduled_functions() local fs = require("luarocks.fs") - fs.change_dir_to_root() + if fs.change_dir_to_root then + fs.change_dir_to_root() + end for i = #scheduled_functions, 1, -1 do local item = scheduled_functions[i] item.fn(unpack(item.args)) -- cgit v1.2.3-55-g6feb