72 lines
2.0 KiB
Lua
72 lines
2.0 KiB
Lua
local M = {}
|
|
|
|
-- Define sources outside the function to avoid re-allocation
|
|
local SOURCES = {
|
|
gl = "https://gitlab.com/",
|
|
cb = "https://codeberg.org/",
|
|
gh = "https://github.com/",
|
|
}
|
|
|
|
--- Resolves a shorthand URL or full URL to its canonical form.
|
|
local function resolve_url(url)
|
|
if not url or url:match("^https?://") then
|
|
return url
|
|
end
|
|
|
|
-- Extract prefix if present (e.g., 'gl:user/repo')
|
|
local prefix, rest = url:match("^(%w+):(.+)$")
|
|
if prefix and SOURCES[prefix] then
|
|
return SOURCES[prefix] .. rest
|
|
end
|
|
|
|
-- Default to GitHub if no prefix or unknown prefix
|
|
return SOURCES.gh .. url
|
|
end
|
|
|
|
--- Normalizes a plugin specification.
|
|
local function normalize_spec(spec)
|
|
if type(spec) == "string" then
|
|
return resolve_url(spec)
|
|
elseif type(spec) == "table" and spec.src then
|
|
spec.src = resolve_url(spec.src)
|
|
return spec
|
|
end
|
|
return spec
|
|
end
|
|
|
|
--- Global helper to add plugins to the package manager.
|
|
--- Supports shorthand for GitHub (default), GitLab (gl:), and Codeberg (cb:).
|
|
---
|
|
--- Examples:
|
|
--- add("user/repo") --> https://github.com/user/repo
|
|
--- add("gl:user/repo") --> https://gitlab.com/user/repo
|
|
--- add("cb:user/repo") --> https://codeberg.org/user/repo
|
|
--- add({ "user/repo", version = "main" })
|
|
--- add({ "user/repo", "gl:other/repo" })
|
|
---
|
|
_G.add = function(specs)
|
|
-- Normalize input to a table if a single spec is provided
|
|
local list = type(specs) == "table" and (specs.src or not specs[1]) and { specs } or specs
|
|
if type(list) ~= "table" then
|
|
list = { specs }
|
|
end
|
|
|
|
local resolved = {}
|
|
for _, spec in ipairs(list) do
|
|
local normalized = normalize_spec(spec)
|
|
if normalized then
|
|
table.insert(resolved, normalized)
|
|
end
|
|
end
|
|
|
|
if #resolved > 0 then
|
|
-- Wrap in pcall to handle potential vim.pack errors gracefully
|
|
local ok, err = pcall(vim.pack.add, resolved)
|
|
if not ok then
|
|
vim.notify("vim.pack.add failed: " .. tostring(err), vim.log.levels.ERROR, { title = "Pack Helper" })
|
|
end
|
|
end
|
|
end
|
|
|
|
return M
|