From 7b730490ade3690d1b39bbb9f5c51c4cead974ed Mon Sep 17 00:00:00 2001 From: Hisham Muhammad Date: Thu, 25 Jul 2019 15:48:08 -0300 Subject: fs: fix initialization of platform-specific fallbacks --- src/luarocks/core/cfg.lua | 15 ++++++++++++--- src/luarocks/fs.lua | 33 ++++++++++++++++----------------- 2 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/luarocks/core/cfg.lua b/src/luarocks/core/cfg.lua index 0505b11d..a1ebe4e4 100644 --- a/src/luarocks/core/cfg.lua +++ b/src/luarocks/core/cfg.lua @@ -806,12 +806,21 @@ function cfg.init(detected, warning) return platforms[name] end - function cfg.each_platform() - local i = 0 + -- @param direction (optional) "least-specific-first" (default) or "most-specific-first" + function cfg.each_platform(direction) + direction = direction or "least-specific-first" + local i, delta + if direction == "least-specific-first" then + i = 0 + delta = 1 + else + i = #platform_order + 1 + delta = -1 + end return function() local p repeat - i = i + 1 + i = i + delta p = platform_order[i] until (not p) or platforms[p] return p diff --git a/src/luarocks/fs.lua b/src/luarocks/fs.lua index 849ee4d3..f3c474eb 100644 --- a/src/luarocks/fs.lua +++ b/src/luarocks/fs.lua @@ -51,7 +51,7 @@ end do local function load_fns(fs_table, inits) for name, fn in pairs(fs_table) do - if not fs[name] then + if name ~= "init" and not fs[name] then fs[name] = fn end end @@ -60,6 +60,15 @@ do end end + local function load_platform_fns(patt, inits) + for platform in cfg.each_platform("most-specific-first") do + local ok, fs_plat = pcall(require, patt:format(platform)) + if ok and fs_plat then + load_fns(fs_plat, inits) + end + end + end + function fs.init() if fs.current_dir then -- already initialized @@ -73,26 +82,16 @@ do local inits = {} -- 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, inits) - break - end - end + load_platform_fns("luarocks.fs.%s", inits) -- Load platform-independent pure-Lua functionality - local fs_lua = require("luarocks.fs.lua") - load_fns(fs_lua, inits) + load_fns(require("luarocks.fs.lua"), inits) -- 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, inits) - load_fns(require("luarocks.fs.tools")) - end + load_platform_fns("luarocks.fs.%s.tools", inits) + + -- Load platform-independent external tool functionality + load_fns(require("luarocks.fs.tools"), inits) -- Run platform-specific initializations after everything is loaded for _, init in ipairs(inits) do -- cgit v1.2.3-55-g6feb