1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
local fn = vim.fn
local extension_module = require "telescope._extensions"
local extension_info = require("telescope").extensions
local is_win = vim.api.nvim_call_function("has", { "win32" }) == 1
local health_start = vim.fn["health#report_start"]
local health_ok = vim.fn["health#report_ok"]
local health_warn = vim.fn["health#report_warn"]
local health_error = vim.fn["health#report_error"]
local health_info = vim.fn["health#report_info"]
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 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
health_start "Checking for required plugins"
for _, plugin in ipairs(required_plugins) do
if lualib_installed(plugin.lib) then
health_ok(plugin.lib .. " installed.")
else
local lib_not_installed = plugin.lib .. " not found."
if plugin.optional then
health_warn(("%s %s"):format(lib_not_installed, plugin.info))
else
health_error(lib_not_installed)
end
end
end
-- external dependencies
-- TODO: only perform checks if user has enabled dependency in their config
health_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
health_warn(("%s %s"):format(err_msg, ("Install %s for extended capabilities"):format(package.url)))
else
health_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"
health_ok(("%s: found %s"):format(package.name, version:sub(0, eol - 1) or "(unknown version)"))
end
end
end
-- Extensions
health_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]
health_start(string.format("Telescope Extension: `%s`", installed_ext))
if extension_healthcheck then
extension_healthcheck()
else
health_info "No healthcheck provided"
end
end
end
return M
|