diff --git a/lua/lazy/core/config.lua b/lua/lazy/core/config.lua index df520c8..a119737 100644 --- a/lua/lazy/core/config.lua +++ b/lua/lazy/core/config.lua @@ -49,6 +49,8 @@ M.defaults = { enabled = true, root = vim.fn.stdpath("data") .. "/lazy-rocks", server = "https://nvim-neorocks.github.io/rocks-binaries/", + -- use hererocks to install luarocks. + hererocks = vim.fn.executable("luarocks") == 0, }, dev = { ---@type string | fun(plugin: LazyPlugin): string directory where you store your local plugin projects diff --git a/lua/lazy/core/meta.lua b/lua/lazy/core/meta.lua index 4645f1b..6978d96 100644 --- a/lua/lazy/core/meta.lua +++ b/lua/lazy/core/meta.lua @@ -33,7 +33,9 @@ function M:load_pkgs() if not Config.options.pkg.enabled then return end + local have_rockspec = false for _, pkg in ipairs(Pkg.get()) do + have_rockspec = have_rockspec or pkg.source == "rockspec" local meta, fragment = self:add(pkg.spec) if meta and fragment then meta._.pkg = pkg @@ -46,6 +48,12 @@ function M:load_pkgs() self.pkgs[pkg.dir] = fragment.id end end + if have_rockspec then + local hererocks = Pkg.hererocks() + if hererocks then + self:add(hererocks) + end + end end --- Remove a plugin and all its fragments. diff --git a/lua/lazy/core/plugin.lua b/lua/lazy/core/plugin.lua index 062d5d2..cfc7b62 100644 --- a/lua/lazy/core/plugin.lua +++ b/lua/lazy/core/plugin.lua @@ -264,8 +264,10 @@ function M.update_rocks_state() end) for _, plugin in pairs(Config.plugins) do - if plugin._.pkg and plugin._.pkg.source == "rockspec" and plugin.build == "rockspec" then + if plugin.build == "rockspec" then plugin._.build = not installed[plugin.name] + elseif plugin.name == "hererocks" then + plugin._.build = not vim.uv.fs_stat(Config.options.rocks.root .. "/hererocks") end end end diff --git a/lua/lazy/manage/task/plugin.lua b/lua/lazy/manage/task/plugin.lua index cd01a25..6803722 100644 --- a/lua/lazy/manage/task/plugin.lua +++ b/lua/lazy/manage/task/plugin.lua @@ -18,8 +18,25 @@ local B = {} ---@param task LazyTask function B.rockspec(task) + ---@type table + local env = {} + + if Config.options.rocks.hererocks then + local hererocks = Config.options.rocks.root .. "/hererocks" + local sep = jit.os:find("Windows") and ";" or ":" + local path = vim.split(vim.env.PATH, sep) + table.insert(path, 1, hererocks .. "/bin") + env = { + PATH = table.concat(path, sep), + } + local plugin = Config.plugins.hererocks + -- hererocks is still building, so skip for now + if plugin and plugin._.build then + return + end + end + local root = Config.options.rocks.root .. "/" .. task.plugin.name - vim.fn.mkdir(root, "p") task:spawn("luarocks", { args = { "--tree", @@ -33,6 +50,7 @@ function B.rockspec(task) "--force-fast", }, cwd = task.plugin.dir, + env = env, }) end diff --git a/lua/lazy/pkg/init.lua b/lua/lazy/pkg/init.lua index b9620ca..3a7dd4c 100644 --- a/lua/lazy/pkg/init.lua +++ b/lua/lazy/pkg/init.lua @@ -112,6 +112,32 @@ local function _load() Util.track() end +---@return LazyPluginSpec?, string? +function M.hererocks() + if not (Config.options.rocks.enabled and Config.options.rocks.hererocks) then + return + end + + local root = Config.options.rocks.root .. "/hererocks" + + local cmd = { + "python", + "hererocks.py", + "--verbose", + "-l", + "5.1", + "-r", + "latest", + root, + } + + return { + "luarocks/hererocks", + lazy = true, + build = table.concat(cmd, " "), + }, root +end + ---@param dir string ---@return LazyPkg? ---@overload fun():LazyPkg[]