Reconcile Neovim setup packages
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
local lock_path = vim.fs.joinpath(vim.fn.stdpath('config'), 'paq-lock.json')
|
||||
local paq_removed_status = 3
|
||||
|
||||
local function clone_paq()
|
||||
local path = vim.fn.stdpath('data') .. '/site/pack/paqs/opt/paq-nvim'
|
||||
@@ -19,32 +20,102 @@ local function load_paq()
|
||||
return paq
|
||||
end
|
||||
|
||||
local function install_packages()
|
||||
clone_paq()
|
||||
|
||||
local function run_paq(event, operation)
|
||||
local done = false
|
||||
vim.api.nvim_create_autocmd('User', {
|
||||
pattern = 'PaqDoneInstall',
|
||||
pattern = event,
|
||||
once = true,
|
||||
callback = function()
|
||||
done = true
|
||||
end,
|
||||
})
|
||||
|
||||
local paq = load_paq()
|
||||
paq.install()
|
||||
operation()
|
||||
|
||||
vim.wait(60000, function()
|
||||
return done
|
||||
end, 200)
|
||||
|
||||
if not done then
|
||||
return done
|
||||
end
|
||||
|
||||
local function install_packages()
|
||||
clone_paq()
|
||||
|
||||
local paq = load_paq()
|
||||
if not run_paq('PaqDoneInstall', paq.install) then
|
||||
print('Paq installation timeout or failed')
|
||||
else
|
||||
print('Paq installation completed')
|
||||
end
|
||||
end
|
||||
|
||||
local function assert_no_unlisted_package_dirs(paq)
|
||||
local expected_dirs = {}
|
||||
for _, filter in ipairs({ 'installed', 'to_install' }) do
|
||||
for _, pkg in ipairs(paq.query(filter)) do
|
||||
expected_dirs[pkg.dir] = true
|
||||
end
|
||||
end
|
||||
|
||||
local stale_dirs = {}
|
||||
local paq_path = vim.fs.joinpath(vim.fn.stdpath('data'), 'site', 'pack', 'paqs')
|
||||
for _, packdir in ipairs({ 'start', 'opt' }) do
|
||||
local path = vim.fs.joinpath(paq_path, packdir)
|
||||
if vim.uv.fs_stat(path) then
|
||||
for name, type in vim.fs.dir(path) do
|
||||
local dir = vim.fs.joinpath(path, name)
|
||||
if type == 'directory' and not expected_dirs[dir] then
|
||||
table.insert(stale_dirs, dir)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if #stale_dirs > 0 then
|
||||
error('Paq cleanup left unlisted package directories:\n' .. table.concat(stale_dirs, '\n'))
|
||||
end
|
||||
end
|
||||
|
||||
local function prune_removed_lock_entries()
|
||||
if vim.fn.filereadable(lock_path) == 0 then
|
||||
return
|
||||
end
|
||||
|
||||
local raw = table.concat(vim.fn.readfile(lock_path), '\n')
|
||||
local lock = vim.json.decode(raw)
|
||||
local changed = false
|
||||
|
||||
for name, pkg in pairs(lock) do
|
||||
if pkg.status == paq_removed_status then
|
||||
lock[name] = nil
|
||||
changed = true
|
||||
end
|
||||
end
|
||||
|
||||
if changed then
|
||||
vim.fn.writefile({ vim.json.encode(lock) }, lock_path)
|
||||
end
|
||||
end
|
||||
|
||||
local function reconcile_packages()
|
||||
clone_paq()
|
||||
|
||||
local paq = load_paq()
|
||||
if not run_paq('PaqDoneRemove', paq.clean) then
|
||||
print('Paq cleanup timeout or failed')
|
||||
return
|
||||
end
|
||||
assert_no_unlisted_package_dirs(paq)
|
||||
prune_removed_lock_entries()
|
||||
|
||||
if not run_paq('PaqDoneInstall', paq.install) then
|
||||
print('Paq installation timeout or failed')
|
||||
else
|
||||
print('Paq packages reconciled')
|
||||
end
|
||||
end
|
||||
|
||||
local function install_languages()
|
||||
vim.cmd.packadd('mason.nvim')
|
||||
require('mason').setup()
|
||||
@@ -58,7 +129,13 @@ end
|
||||
local function sync_packages()
|
||||
clone_paq()
|
||||
local paq = load_paq()
|
||||
paq:sync()
|
||||
if not run_paq('PaqDoneSync', function()
|
||||
paq:sync()
|
||||
end) then
|
||||
print('Paq sync timeout or failed')
|
||||
else
|
||||
print('Paq sync completed')
|
||||
end
|
||||
end
|
||||
|
||||
local function fetch_lsp_configs()
|
||||
@@ -94,8 +171,8 @@ local function create_command(name, callback, desc)
|
||||
end
|
||||
|
||||
create_command('Setup', function()
|
||||
print('> Installing packages...')
|
||||
install_packages()
|
||||
print('> Reconciling packages...')
|
||||
reconcile_packages()
|
||||
print('\n> Installing languages: treesitter parsers, language servers, linters, formatters...')
|
||||
install_languages()
|
||||
print('\n=== Setup Finished ===\n')
|
||||
|
||||
Reference in New Issue
Block a user