2022-06-23 16:11:47 +02:00
|
|
|
local completed = 0
|
|
|
|
local collection = {}
|
|
|
|
local active_jobs = {}
|
|
|
|
|
|
|
|
local fmt = string.format
|
|
|
|
local core_plugins = require "lvim.plugins"
|
|
|
|
|
|
|
|
local default_snapshot_path = join_paths(get_lvim_base_dir(), "snapshots", "default.json")
|
|
|
|
local fd = io.open(default_snapshot_path, "rb")
|
|
|
|
local content
|
|
|
|
if fd then
|
|
|
|
content = fd:read "*a"
|
|
|
|
end
|
|
|
|
local default_sha1 = vim.json.decode(content)
|
|
|
|
|
|
|
|
local get_short_name = function(spec)
|
|
|
|
return spec[1]:match "/(%S*)"
|
|
|
|
end
|
|
|
|
|
|
|
|
local get_default_sha1 = function(spec)
|
|
|
|
local short_name, _ = get_short_name(spec)
|
|
|
|
assert(default_sha1[short_name])
|
|
|
|
return default_sha1[short_name].commit
|
|
|
|
end
|
|
|
|
|
|
|
|
local is_directory = require("lvim.utils").is_directory
|
2023-01-10 21:18:17 +01:00
|
|
|
local lazydir = join_paths(get_runtime_dir(), "site", "pack", "lazy")
|
2022-10-31 16:27:12 +01:00
|
|
|
|
2023-01-10 21:18:17 +01:00
|
|
|
local verify_lazy = function()
|
|
|
|
if not is_directory(lazydir) then
|
|
|
|
io.write "Lazy.nvim not installed!"
|
2022-10-31 16:27:12 +01:00
|
|
|
os.exit(1)
|
|
|
|
end
|
2023-01-10 21:18:17 +01:00
|
|
|
local status_ok, lazy = pcall(require, "lazy")
|
|
|
|
if status_ok and lazy then
|
2022-10-31 16:27:12 +01:00
|
|
|
return
|
|
|
|
end
|
2023-01-10 21:18:17 +01:00
|
|
|
io.write "Lazy.nvim not installed!"
|
2022-10-31 16:27:12 +01:00
|
|
|
os.exit(1)
|
|
|
|
end
|
|
|
|
|
2022-06-23 16:11:47 +02:00
|
|
|
local get_install_path = function(spec)
|
2023-01-10 21:18:17 +01:00
|
|
|
local prefix = join_paths(lazydir, "opt")
|
2022-06-23 16:11:47 +02:00
|
|
|
local path = join_paths(prefix, get_short_name(spec))
|
2022-09-20 11:41:58 +02:00
|
|
|
return is_directory(path) and path
|
2022-06-23 16:11:47 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
local function call_proc(process, opts, cb)
|
|
|
|
local output, error_output = "", ""
|
|
|
|
local handle_stdout = function(err, chunk)
|
|
|
|
assert(not err, err)
|
|
|
|
if chunk then
|
|
|
|
output = output .. chunk
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
local handle_stderr = function(err, chunk)
|
|
|
|
assert(not err, err)
|
|
|
|
if chunk then
|
|
|
|
error_output = error_output .. chunk
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
local uv = vim.loop
|
|
|
|
local handle
|
|
|
|
|
|
|
|
local stdout = uv.new_pipe(false)
|
|
|
|
local stderr = uv.new_pipe(false)
|
|
|
|
|
|
|
|
local stdio = { nil, stdout, stderr }
|
|
|
|
|
|
|
|
handle = uv.spawn(
|
|
|
|
process,
|
|
|
|
{ args = opts.args, cwd = opts.cwd or uv.cwd(), stdio = stdio },
|
|
|
|
vim.schedule_wrap(function(code)
|
|
|
|
if code ~= 0 then
|
2023-01-10 21:18:17 +01:00
|
|
|
---@diagnostic disable-next-line: undefined-field
|
2022-06-23 16:11:47 +02:00
|
|
|
stdout:read_stop()
|
2023-01-10 21:18:17 +01:00
|
|
|
---@diagnostic disable-next-line: undefined-field
|
2022-06-23 16:11:47 +02:00
|
|
|
stderr:read_stop()
|
|
|
|
end
|
|
|
|
|
|
|
|
local check = uv.new_check()
|
|
|
|
check:start(function()
|
|
|
|
for _, pipe in ipairs(stdio) do
|
|
|
|
if pipe and not pipe:is_closing() then
|
|
|
|
return
|
|
|
|
end
|
|
|
|
end
|
|
|
|
check:stop()
|
|
|
|
handle:close()
|
|
|
|
cb(code, output, error_output)
|
|
|
|
end)
|
|
|
|
end)
|
|
|
|
)
|
|
|
|
|
|
|
|
uv.read_start(stdout, handle_stdout)
|
|
|
|
uv.read_start(stderr, handle_stderr)
|
|
|
|
|
|
|
|
return handle
|
|
|
|
end
|
|
|
|
|
|
|
|
local function verify_core_plugins(verbose)
|
|
|
|
for _, spec in pairs(core_plugins) do
|
2022-09-20 11:41:58 +02:00
|
|
|
local path = get_install_path(spec)
|
2023-01-10 21:18:17 +01:00
|
|
|
if spec.enabled or spec.enabled == nil and path then
|
2022-06-23 16:11:47 +02:00
|
|
|
table.insert(collection, {
|
|
|
|
name = get_short_name(spec),
|
|
|
|
commit = get_default_sha1(spec),
|
2022-09-20 11:41:58 +02:00
|
|
|
path = path,
|
2022-06-23 16:11:47 +02:00
|
|
|
})
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
for _, entry in pairs(collection) do
|
|
|
|
local on_done = function(code, result, errors)
|
|
|
|
completed = completed + 1
|
|
|
|
if code ~= 0 then
|
|
|
|
io.write(errors .. "\n")
|
|
|
|
-- os.exit(code)
|
|
|
|
else
|
|
|
|
if verbose then
|
|
|
|
io.write(fmt("verified [%s]\n", entry.name))
|
|
|
|
end
|
|
|
|
end
|
2022-09-12 18:41:25 +02:00
|
|
|
local current_commit = result:gsub("\n", ""):gsub([[']], [[]]):sub(1, 7)
|
2022-06-23 16:11:47 +02:00
|
|
|
-- just in case there are some extra qutoes or it's a longer commit hash
|
|
|
|
if current_commit ~= entry.commit then
|
|
|
|
io.write(fmt("mismatch at [%s]: expected [%s], got [%s]\n", entry.name, entry.commit, current_commit))
|
|
|
|
os.exit(1)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2022-09-12 18:41:25 +02:00
|
|
|
local handle = call_proc("git", { args = { "rev-parse", "--short", "HEAD" }, cwd = entry.path }, on_done)
|
2022-06-23 16:11:47 +02:00
|
|
|
assert(handle)
|
|
|
|
table.insert(active_jobs, handle)
|
|
|
|
end
|
|
|
|
|
|
|
|
vim.wait(#active_jobs * 60 * 1000, function()
|
2023-01-10 21:18:17 +01:00
|
|
|
---@diagnostic disable-next-line: redundant-return-value
|
2022-06-23 16:11:47 +02:00
|
|
|
return completed == #active_jobs
|
|
|
|
end)
|
|
|
|
end
|
|
|
|
|
2023-01-10 21:18:17 +01:00
|
|
|
verify_lazy()
|
2022-06-23 16:11:47 +02:00
|
|
|
verify_core_plugins()
|
|
|
|
vim.cmd "q"
|