feat(rocks): use hererocks to install luarocks when luarocks is not found

This commit is contained in:
Folke Lemaitre 2024-06-25 07:55:30 +02:00
parent dea1f687fe
commit d87da76679
No known key found for this signature in database
GPG Key ID: 41F8B1FBACAE2040
5 changed files with 58 additions and 2 deletions

View File

@ -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

View File

@ -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.

View File

@ -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

View File

@ -18,8 +18,25 @@ local B = {}
---@param task LazyTask
function B.rockspec(task)
---@type table<string, string>
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

View File

@ -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[]