mirror of
https://github.com/SpaceVim/SpaceVim.git
synced 2025-01-23 12:50:04 +08:00
131 lines
3.5 KiB
Lua
131 lines
3.5 KiB
Lua
local health = vim.health or require "health"
|
|
local start = health.start or health.report_start
|
|
local ok = health.ok or health.report_ok
|
|
local warn = health.warn or health.report_warn
|
|
local error = health.error or health.report_error
|
|
local info = health.info or health.report_info
|
|
|
|
local extension_module = require "telescope._extensions"
|
|
local extension_info = require("telescope").extensions
|
|
local is_win = vim.api.nvim_call_function("has", { "win32" }) == 1
|
|
|
|
local optional_dependencies = {
|
|
{
|
|
finder_name = "live-grep",
|
|
package = {
|
|
{
|
|
name = "rg",
|
|
url = "[BurntSushi/ripgrep](https://github.com/BurntSushi/ripgrep)",
|
|
optional = false,
|
|
},
|
|
},
|
|
},
|
|
{
|
|
finder_name = "find-files",
|
|
package = {
|
|
{
|
|
name = "fd",
|
|
binaries = { "fdfind", "fd" },
|
|
url = "[sharkdp/fd](https://github.com/sharkdp/fd)",
|
|
optional = true,
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
local required_plugins = {
|
|
{ lib = "plenary", optional = false },
|
|
{
|
|
lib = "nvim-treesitter",
|
|
optional = true,
|
|
info = "",
|
|
},
|
|
}
|
|
|
|
local check_binary_installed = function(package)
|
|
local binaries = package.binaries or { package.name }
|
|
for _, binary in ipairs(binaries) do
|
|
if is_win then
|
|
binary = binary .. ".exe"
|
|
end
|
|
if vim.fn.executable(binary) == 1 then
|
|
local handle = io.popen(binary .. " --version")
|
|
local binary_version = handle:read "*a"
|
|
handle:close()
|
|
return true, binary_version
|
|
end
|
|
end
|
|
end
|
|
|
|
local function lualib_installed(lib_name)
|
|
local res, _ = pcall(require, lib_name)
|
|
return res
|
|
end
|
|
|
|
local M = {}
|
|
|
|
M.check = function()
|
|
-- Required lua libs
|
|
start "Checking for required plugins"
|
|
for _, plugin in ipairs(required_plugins) do
|
|
if lualib_installed(plugin.lib) then
|
|
ok(plugin.lib .. " installed.")
|
|
else
|
|
local lib_not_installed = plugin.lib .. " not found."
|
|
if plugin.optional then
|
|
warn(("%s %s"):format(lib_not_installed, plugin.info))
|
|
else
|
|
error(lib_not_installed)
|
|
end
|
|
end
|
|
end
|
|
|
|
-- external dependencies
|
|
-- TODO: only perform checks if user has enabled dependency in their config
|
|
start "Checking external dependencies"
|
|
|
|
for _, opt_dep in pairs(optional_dependencies) do
|
|
for _, package in ipairs(opt_dep.package) do
|
|
local installed, version = check_binary_installed(package)
|
|
if not installed then
|
|
local err_msg = ("%s: not found."):format(package.name)
|
|
if package.optional then
|
|
warn(("%s %s"):format(err_msg, ("Install %s for extended capabilities"):format(package.url)))
|
|
else
|
|
error(
|
|
("%s %s"):format(
|
|
err_msg,
|
|
("`%s` finder will not function without %s installed."):format(opt_dep.finder_name, package.url)
|
|
)
|
|
)
|
|
end
|
|
else
|
|
local eol = version:find "\n"
|
|
ok(("%s: found %s"):format(package.name, version:sub(0, eol - 1) or "(unknown version)"))
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Extensions
|
|
start "===== Installed extensions ====="
|
|
|
|
local installed = {}
|
|
for extension_name, _ in pairs(extension_info) do
|
|
installed[#installed + 1] = extension_name
|
|
end
|
|
table.sort(installed)
|
|
|
|
for _, installed_ext in ipairs(installed) do
|
|
local extension_healthcheck = extension_module._health[installed_ext]
|
|
|
|
start(string.format("Telescope Extension: `%s`", installed_ext))
|
|
if extension_healthcheck then
|
|
extension_healthcheck()
|
|
else
|
|
info "No healthcheck provided"
|
|
end
|
|
end
|
|
end
|
|
|
|
return M
|