fix(util): made `Util.lsmod` more robust. See #298

This commit is contained in:
Folke Lemaitre 2023-01-03 22:31:18 +01:00
parent f36c7cb0dc
commit 953c2791d8
No known key found for this signature in database
GPG Key ID: 41F8B1FBACAE2040
3 changed files with 52 additions and 15 deletions

View File

@ -257,14 +257,14 @@ function M.get_topmods(path)
end end
---@param modname string ---@param modname string
---@return string?, string? ---@return string?
function M.find_dir(modname) function M.find_root(modname)
if M.cache[modname] then if M.cache[modname] then
-- check if modname is in cache -- check if modname is in cache
local modpath = M.cache[modname].modpath local modpath = M.cache[modname].modpath
if M.check_path(modname, modpath) then if M.check_path(modname, modpath) then
local root = modpath:gsub("/init%.lua$", ""):gsub("%.lua$", "") local root = modpath:gsub("/init%.lua$", ""):gsub("%.lua$", "")
return root, modpath return root
end end
else else
-- in case modname is just a directory and not a real mod, -- in case modname is just a directory and not a real mod,
@ -286,7 +286,7 @@ function M.find_dir(modname)
local modpath = M.find(modname, { patterns = { "" } }) local modpath = M.find(modname, { patterns = { "" } })
if modpath then if modpath then
local root = modpath:gsub("/init%.lua$", ""):gsub("%.lua$", "") local root = modpath:gsub("/init%.lua$", ""):gsub("%.lua$", "")
return root, (modpath ~= root and modpath or nil) return root
end end
end end

View File

@ -195,13 +195,13 @@ end
---@param fn fun(modname:string, modpath:string) ---@param fn fun(modname:string, modpath:string)
function M.lsmod(modname, fn) function M.lsmod(modname, fn)
local Cache = require("lazy.core.cache") local Cache = require("lazy.core.cache")
local root, modpath = Cache.find_dir(modname) local root = Cache.find_root(modname)
if not root then if not root then
return return
end end
if modpath and not modpath:find("/init%.lua$") and vim.loop.fs_stat(modpath) then if vim.loop.fs_stat(root .. ".lua") then
fn(modname, modpath) fn(modname, root .. ".lua")
end end
M.ls(root, function(path, name, type) M.ls(root, function(path, name, type)

View File

@ -10,31 +10,68 @@ describe("util", function()
it("lsmod lists all mods in dir", function() it("lsmod lists all mods in dir", function()
local tests = { local tests = {
{ {
root = "lua/foo",
mod = "foo",
files = { "lua/foo/one.lua", "lua/foo/two.lua", "lua/foo/init.lua" }, files = { "lua/foo/one.lua", "lua/foo/two.lua", "lua/foo/init.lua" },
mods = { "foo", "foo.one", "foo.two" }, mods = { "foo.one", "foo.two", "foo" },
}, },
{ {
root = "lua/foo",
mod = "foo",
files = { "lua/foo/one.lua", "lua/foo/two.lua", "lua/foo.lua" }, files = { "lua/foo/one.lua", "lua/foo/two.lua", "lua/foo.lua" },
mods = { "foo", "foo.one", "foo.two" }, mods = { "foo.one", "foo.two", "foo" },
}, },
{ {
root = "lua/foo",
mod = "foo",
files = { "lua/foo/one.lua", "lua/foo/two.lua" }, files = { "lua/foo/one.lua", "lua/foo/two.lua" },
mods = { "foo.one", "foo.two" }, mods = { "foo.one", "foo.two" },
}, },
{
root = "lua/load-plugins",
mod = "load-plugins",
files = { "lua/load-plugins.lua" },
mods = { "load-plugins" },
},
} }
vim.opt.rtp:append(Helpers.path("")) vim.opt.rtp:append(Helpers.path(""))
for _, test in ipairs(tests) do for t, test in ipairs(tests) do
Cache.cache = {} local expected = vim.deepcopy(test.mods)
table.sort(test.mods) table.sort(expected)
Helpers.fs_rm("") Helpers.fs_rm("")
Helpers.fs_create(test.files) local files = Helpers.fs_create(test.files)
-- test with empty cache
Cache.cache = {}
Cache.indexed = {}
Cache.indexed_rtp = false
local root = Cache.find_root(test.mod)
assert(root, "no root found for " .. test.mod .. " (test " .. t .. ")")
assert.same(Helpers.path(test.root), root)
local mods = {} local mods = {}
Util.lsmod("foo", function(modname, modpath) Util.lsmod(test.mod, function(modname, modpath)
mods[#mods + 1] = modname mods[#mods + 1] = modname
end) end)
table.sort(mods) table.sort(mods)
assert.same(test.mods, mods) assert.same(expected, mods)
-- fill the cache
Cache.cache = {}
for i, file in ipairs(files) do
Cache.cache[test.mods[i]] = { modpath = file }
end
Cache.indexed = {}
Cache.indexed_rtp = false
root = Cache.find_root(test.mod)
assert(root, "no root found for " .. test.mod .. " (test " .. t .. ")")
assert.same(Helpers.path(test.root), root)
mods = {}
Util.lsmod(test.mod, function(modname, modpath)
mods[#mods + 1] = modname
end)
table.sort(mods)
assert.same(expected, mods)
end end
end) end)
end) end)