summaryrefslogtreecommitdiff
path: root/lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua')
-rw-r--r--lua/lvim/plugin-loader.lua93
-rw-r--r--lua/lvim/plugins.lua97
-rw-r--r--lua/lvim/utils/git.lua18
-rw-r--r--lua/lvim/utils/hooks.lua24
4 files changed, 94 insertions, 138 deletions
diff --git a/lua/lvim/plugin-loader.lua b/lua/lvim/plugin-loader.lua
index 5208d5bf..1b91cdf4 100644
--- a/lua/lvim/plugin-loader.lua
+++ b/lua/lvim/plugin-loader.lua
@@ -1,33 +1,25 @@
local plugin_loader = {}
-local in_headless = #vim.api.nvim_list_uis() == 0
-
local utils = require "lvim.utils"
local Log = require "lvim.core.log"
+local join_paths = utils.join_paths
+
-- we need to reuse this outside of init()
-local compile_path = get_config_dir() .. "/plugin/packer_compiled.lua"
+local compile_path = join_paths(get_config_dir(), "plugin", "packer_compiled.lua")
+local snapshot_path = join_paths(get_cache_dir(), "snapshots")
+local default_snapshot = join_paths(get_lvim_base_dir(), "snapshots", "default.json")
function plugin_loader.init(opts)
opts = opts or {}
- local install_path = opts.install_path or vim.fn.stdpath "data" .. "/site/pack/packer/start/packer.nvim"
- local package_root = opts.package_root or vim.fn.stdpath "data" .. "/site/pack"
+ local install_path = opts.install_path
+ or join_paths(vim.fn.stdpath "data", "site", "pack", "packer", "start", "packer.nvim")
- if vim.fn.empty(vim.fn.glob(install_path)) > 0 then
- vim.fn.system { "git", "clone", "--depth", "1", "https://github.com/wbthomason/packer.nvim", install_path }
- vim.cmd "packadd packer.nvim"
- end
-
- local log_level = in_headless and "debug" or "warn"
- if lvim.log and lvim.log.level then
- log_level = lvim.log.level
- end
-
- local _, packer = pcall(require, "packer")
- packer.init {
- package_root = package_root,
+ local init_opts = {
+ package_root = opts.package_root or join_paths(vim.fn.stdpath "data", "site", "pack"),
compile_path = compile_path,
- log = { level = log_level },
+ snapshot_path = snapshot_path,
+ log = { level = "warn" },
git = {
clone_timeout = 300,
subcommands = {
@@ -35,7 +27,6 @@ function plugin_loader.init(opts)
fetch = "fetch --no-tags --no-recurse-submodules --update-shallow --progress",
},
},
- max_jobs = 50,
display = {
open_fn = function()
return require("packer.util").float { border = "rounded" }
@@ -43,9 +34,28 @@ function plugin_loader.init(opts)
},
}
- if not in_headless then
+ local in_headless = #vim.api.nvim_list_uis() == 0
+ if in_headless then
+ init_opts.display = nil
+
+ -- NOTE: `lvim.log.level` may not be loaded from the user's config yet
+ init_opts.log.level = lvim.log and lvim.log.level or "info"
+ else
vim.cmd [[autocmd User PackerComplete lua require('lvim.utils.hooks').run_on_packer_complete()]]
end
+
+ if vim.fn.empty(vim.fn.glob(install_path)) > 0 then
+ vim.fn.system { "git", "clone", "--depth", "1", "https://github.com/wbthomason/packer.nvim", install_path }
+ vim.cmd "packadd packer.nvim"
+ -- IMPORTANT: we only set this the very first time to avoid constantly triggering the rollback function
+ -- https://github.com/wbthomason/packer.nvim/blob/c576ab3f1488ee86d60fd340d01ade08dcabd256/lua/packer.lua#L998-L995
+ init_opts.snapshot = default_snapshot
+ end
+
+ local status_ok, packer = pcall(require, "packer")
+ if status_ok then
+ packer.init(init_opts)
+ end
end
-- packer expects a space separated list
@@ -81,6 +91,7 @@ function plugin_loader.load(configurations)
return
end
local status_ok, _ = xpcall(function()
+ packer.reset()
packer.startup(function(use)
for _, plugins in ipairs(configurations) do
for _, plugin in ipairs(plugins) do
@@ -88,9 +99,6 @@ function plugin_loader.load(configurations)
end
end
end)
- -- colorscheme must get called after plugins are loaded or it will break new installs.
- vim.g.colors_name = lvim.colorscheme
- vim.cmd("colorscheme " .. lvim.colorscheme)
end, debug.traceback)
if not status_ok then
Log:warn "problems detected while loading plugins' configurations"
@@ -102,21 +110,38 @@ function plugin_loader.get_core_plugins()
local list = {}
local plugins = require "lvim.plugins"
for _, item in pairs(plugins) do
- table.insert(list, item[1]:match "/(%S*)")
+ if not item.disable then
+ table.insert(list, item[1]:match "/(%S*)")
+ end
end
return list
end
-function plugin_loader.sync_core_plugins()
+function plugin_loader.sync_core_plugins(opts)
+ opts = opts or {}
+ Log:debug(string.format("Syncing core plugins with snapshot file [%s]", default_snapshot))
+ local packer = require "packer"
+ local a = require "packer.async"
+ local async = a.sync
+ local await = a.wait
+ local main = a.main
local core_plugins = plugin_loader.get_core_plugins()
- Log:trace(string.format("Syncing core plugins: [%q]", table.concat(core_plugins, ", ")))
- pcall_packer_command("sync", core_plugins)
-end
-
-function plugin_loader.ensure_installed()
- local all_plugins = _G.packer_plugins or plugin_loader.get_core_plugins()
- Log:trace(string.format("Syncing core plugins: [%q]", table.concat(all_plugins, ", ")))
- pcall_packer_command("install", all_plugins)
+ async(function()
+ await(packer.rollback(default_snapshot, unpack(core_plugins)))
+ :map_ok(function(ok) --NOTE: these may not be doing anything, use PackerComplete for now
+ await(main)
+ Log:debug(string.format("Rollback snapshot file [%s] completed", default_snapshot))
+ if next(ok.failed) then
+ Log:warn(string.format("Couldn't rollback %s", vim.inspect(ok.failed)))
+ end
+ pcall(opts.on_complete, ok)
+ end)
+ :map_err(function(err)
+ await(main)
+ Log:error(err)
+ pcall(opts.on_error, err)
+ end)
+ end)()
end
return plugin_loader
diff --git a/lua/lvim/plugins.lua b/lua/lvim/plugins.lua
index d7ecdccb..9ead83d2 100644
--- a/lua/lvim/plugins.lua
+++ b/lua/lvim/plugins.lua
@@ -1,56 +1,14 @@
-local commit = {
- alpha_nvim = "14be0ac200f44009672046123c6fcb30724018a5",
- bufferline = "5e101b1b4e1ea5b868b8865a5f749b0b5b8f3ccd",
- cmp_buffer = "d66c4c2d376e5be99db68d2362cd94d250987525",
- cmp_luasnip = "d6f837f4e8fe48eeae288e638691b91b97d1737f",
- cmp_nvim_lsp = "ebdfc204afb87f15ce3d3d3f5df0b8181443b5ba",
- cmp_path = "466b6b8270f7ba89abd59f402c73f63c7331ff6e",
- comment = "a841f73523440c4f32d39f0290cf1e691311db2a",
- dapinstall = "24923c3819a450a772bb8f675926d530e829665f",
- fixcursorhold = "1bfb32e7ba1344925ad815cb0d7f901dbc0ff7c1",
- friendly_snippets = "ad07b2844021b20797adda5b483265802559a693",
- gitsigns = "2df360de757c39c04076cb04bcbbd361dec3c8c2",
- lua_dev = "a0ee77789d9948adce64d98700cc90cecaef88d5",
- lualine = "181b14348f513e6f9eb3bdd2252e13630094fdd3",
- luasnip = "ee350179f842699a42b3d6277b2ded8ce73bdc33",
- nlsp_settings = "ea9b88e289359843c3cc5bfbf42e5ed9cc3df5f2",
- null_ls = "041601cb03daa8982c5af6edc6641f4b97e9d6b5",
- nvim_autopairs = "6617498bea01c9c628406d7e23030da57f2f8718",
- nvim_cmp = "71d7f46b930bf08e982925c77bd9b0a9808c1162",
- nvim_dap = "3d0575a777610b364fea745b85ad497d56b8009a",
- nvim_lsp_installer = "dc783087bef65cc7c2943d8641ff1b6dfff6e5a9",
- nvim_lspconfig = "710deb04d9f8b73517e1d995a57a1505cbbaac51",
- nvim_notify = "f81b48d298c0ff7479b66568d9cc1a4794c196d0",
- nvim_tree = "20797a8d74e68bce50b98455c76c5de250c6f0e5",
- nvim_treesitter = "fd92e70c69330dd8f2f6753d3d987c34e7dacd24",
- nvim_ts_context_commentstring = "097df33c9ef5bbd3828105e4bee99965b758dc3f",
- nvim_web_devicons = "4415d1aaa56f73b9c05795af84d625c610b05d3b",
- onedarker = "b00dd2189f264c5aeb4cf04c59439655ecd573ec",
- packer = "c576ab3f1488ee86d60fd340d01ade08dcabd256",
- plenary = "14dfb4071022b22e08384ee125a5607464b6d397",
- popup = "b7404d35d5d3548a82149238289fa71f7f6de4ac",
- project = "cef52b8da07648b750d7f1e8fb93f12cb9482988",
- schemastore = "265eabf9f8ab33cc6bf1683c286b04e280a2b2e7",
- structlog = "6f1403a192791ff1fa7ac845a73de9e860f781f1",
- telescope = "a36a813d5d031e6f5d52b74986915e68130febd9",
- telescope_fzf_native = "8ec164b541327202e5e74f99bcc5fe5845720e18",
- toggleterm = "e97d0c1046512e975a9f3fa95afe98f312752b1c",
- which_key = "a3c19ec5754debb7bf38a8404e36a9287b282430",
-}
-
-return {
+local core_plugins = {
-- Packer can manage itself as an optional plugin
- { "wbthomason/packer.nvim", commit = commit.packer },
- { "neovim/nvim-lspconfig", commit = commit.nvim_lspconfig },
- { "tamago324/nlsp-settings.nvim", commit = commit.nlsp_settings },
+ { "wbthomason/packer.nvim" },
+ { "neovim/nvim-lspconfig" },
+ { "tamago324/nlsp-settings.nvim" },
{
"jose-elias-alvarez/null-ls.nvim",
- commit = commit.null_ls,
},
- { "antoinemadec/FixCursorHold.nvim", commit = commit.fixcursorhold }, -- Needed while issue https://github.com/neovim/neovim/issues/12587 is still open
+ { "antoinemadec/FixCursorHold.nvim" }, -- Needed while issue https://github.com/neovim/neovim/issues/12587 is still open
{
"williamboman/nvim-lsp-installer",
- commit = commit.nvim_lsp_installer,
},
{
"lunarvim/onedarker.nvim",
@@ -58,26 +16,25 @@ return {
require("onedarker").setup()
lvim.builtin.lualine.options.theme = "onedarker"
end,
- commit = commit.onedarker,
disable = lvim.colorscheme ~= "onedarker",
},
{
"rcarriga/nvim-notify",
- commit = commit.nvim_notify,
+
config = function()
require("lvim.core.notify").setup()
end,
requires = { "nvim-telescope/telescope.nvim" },
disable = not lvim.builtin.notify.active or not lvim.builtin.telescope.active,
},
- { "Tastyep/structlog.nvim", commit = commit.structlog },
+ { "Tastyep/structlog.nvim" },
- { "nvim-lua/popup.nvim", commit = commit.popup },
- { "nvim-lua/plenary.nvim", commit = commit.plenary },
+ { "nvim-lua/popup.nvim" },
+ { "nvim-lua/plenary.nvim" },
-- Telescope
{
"nvim-telescope/telescope.nvim",
- commit = commit.telescope,
+
config = function()
require("lvim.core.telescope").setup()
end,
@@ -86,14 +43,12 @@ return {
{
"nvim-telescope/telescope-fzf-native.nvim",
requires = { "nvim-telescope/telescope.nvim" },
- commit = commit.telescope_fzf_native,
run = "make",
disable = not lvim.builtin.telescope.active,
},
-- Install nvim-cmp, and buffer source as a dependency
{
"hrsh7th/nvim-cmp",
- commit = commit.nvim_cmp,
config = function()
if lvim.builtin.cmp then
require("lvim.core.cmp").setup()
@@ -106,41 +61,33 @@ return {
},
{
"rafamadriz/friendly-snippets",
- commit = commit.friendly_snippets,
},
{
"L3MON4D3/LuaSnip",
config = function()
require("luasnip/loaders/from_vscode").lazy_load()
end,
- commit = commit.luasnip,
},
{
"hrsh7th/cmp-nvim-lsp",
- commit = commit.cmp_nvim_lsp,
},
{
"saadparwaiz1/cmp_luasnip",
- commit = commit.cmp_luasnip,
},
{
"hrsh7th/cmp-buffer",
- commit = commit.cmp_buffer,
},
{
"hrsh7th/cmp-path",
- commit = commit.cmp_path,
},
{
"folke/lua-dev.nvim",
module = "lua-dev",
- commit = commit.lua_dev,
},
-- Autopairs
{
"windwp/nvim-autopairs",
- commit = commit.nvim_autopairs,
-- event = "InsertEnter",
config = function()
require("lvim.core.autopairs").setup()
@@ -151,7 +98,6 @@ return {
-- Treesitter
{
"nvim-treesitter/nvim-treesitter",
- commit = commit.nvim_treesitter,
branch = vim.fn.has "nvim-0.6" == 1 and "master" or "0.5-compat",
-- run = ":TSUpdate",
config = function()
@@ -160,7 +106,6 @@ return {
},
{
"JoosepAlviste/nvim-ts-context-commentstring",
- commit = commit.nvim_ts_context_commentstring,
event = "BufReadPost",
},
@@ -169,7 +114,6 @@ return {
"kyazdani42/nvim-tree.lua",
-- event = "BufWinOpen",
-- cmd = "NvimTreeToggle",
- commit = commit.nvim_tree,
config = function()
require("lvim.core.nvimtree").setup()
end,
@@ -178,7 +122,6 @@ return {
{
"lewis6991/gitsigns.nvim",
- commit = commit.gitsigns,
config = function()
require("lvim.core.gitsigns").setup()
@@ -190,7 +133,6 @@ return {
-- Whichkey
{
"folke/which-key.nvim",
- commit = commit.which_key,
config = function()
require("lvim.core.which-key").setup()
end,
@@ -201,7 +143,6 @@ return {
-- Comments
{
"numToStr/Comment.nvim",
- commit = commit.comment,
event = "BufRead",
config = function()
require("lvim.core.comment").setup()
@@ -212,7 +153,6 @@ return {
-- project.nvim
{
"ahmedkhalf/project.nvim",
- commit = commit.project,
config = function()
require("lvim.core.project").setup()
end,
@@ -220,13 +160,12 @@ return {
},
-- Icons
- { "kyazdani42/nvim-web-devicons", commit = commit.nvim_web_devicons },
+ { "kyazdani42/nvim-web-devicons" },
-- Status Line and Bufferline
{
-- "hoob3rt/lualine.nvim",
"nvim-lualine/lualine.nvim",
- commit = commit.lualine,
-- "Lunarvim/lualine.nvim",
config = function()
require("lvim.core.lualine").setup()
@@ -236,7 +175,6 @@ return {
{
"akinsho/bufferline.nvim",
- commit = commit.bufferline,
config = function()
require("lvim.core.bufferline").setup()
end,
@@ -247,7 +185,6 @@ return {
-- Debugging
{
"mfussenegger/nvim-dap",
- commit = commit.nvim_dap,
-- event = "BufWinEnter",
config = function()
require("lvim.core.dap").setup()
@@ -258,7 +195,6 @@ return {
-- Debugger management
{
"Pocco81/DAPInstall.nvim",
- commit = commit.dapinstall,
-- event = "BufWinEnter",
-- event = "BufRead",
disable = not lvim.builtin.dap.active,
@@ -270,14 +206,12 @@ return {
config = function()
require("lvim.core.alpha").setup()
end,
- commit = commit.alpha_nvim,
disable = not lvim.builtin.alpha.active,
},
-- Terminal
{
"akinsho/toggleterm.nvim",
- commit = commit.toggleterm,
event = "BufWinEnter",
config = function()
require("lvim.core.terminal").setup()
@@ -288,6 +222,13 @@ return {
-- SchemaStore
{
"b0o/schemastore.nvim",
- commit = commit.schemastore,
},
}
+
+for _, entry in ipairs(core_plugins) do
+ if not os.getenv "LVIM_DEV_MODE" then
+ entry["lock"] = true
+ end
+end
+
+return core_plugins
diff --git a/lua/lvim/utils/git.lua b/lua/lvim/utils/git.lua
index ce323160..9848835e 100644
--- a/lua/lvim/utils/git.lua
+++ b/lua/lvim/utils/git.lua
@@ -113,22 +113,4 @@ function M.get_lvim_current_sha()
return abbrev_version
end
-function M.generate_plugins_sha(output)
- local list = {}
- output = output or "commits.lua"
-
- local core_plugins = require "lvim.plugins"
- for _, plugin in pairs(core_plugins) do
- local name = plugin[1]:match "/(%S*)"
- local url = "https://github.com/" .. plugin[1]
- print("checking: " .. name .. ", at: " .. url)
- local retval, latest_sha = git_cmd { args = { "ls-remote", url, "origin", "HEAD" } }
- if retval == 0 then
- -- replace dashes, remove postfixes and use lowercase
- local normalize_name = (name:gsub("-", "_"):gsub("%.%S+", "")):lower()
- list[normalize_name] = latest_sha[1]:gsub("\tHEAD", "")
- end
- end
- require("lvim.utils").write_file(output, "local commit = " .. vim.inspect(list), "w")
-end
return M
diff --git a/lua/lvim/utils/hooks.lua b/lua/lvim/utils/hooks.lua
index b40f2c23..8b057884 100644
--- a/lua/lvim/utils/hooks.lua
+++ b/lua/lvim/utils/hooks.lua
@@ -12,17 +12,25 @@ function M.run_pre_reload()
end
function M.run_on_packer_complete()
- if not in_headless then
- -- manually trigger event to fix colors
- vim.cmd [[ doautocmd ColorScheme ]]
- end
- Log:info "Reloaded configuration"
+ vim.schedule(function()
+ if not in_headless then
+ -- colorscheme must get called after plugins are loaded or it will break new installs.
+ vim.g.colors_name = lvim.colorscheme
+ vim.cmd("colorscheme " .. lvim.colorscheme)
+ else
+ Log:debug "Packer operation complete"
+ end
+ end)
end
function M.run_post_reload()
Log:debug "Starting post-reload hook"
- require("lvim.plugin-loader").ensure_installed()
M.reset_cache()
+ vim.schedule(function()
+ if not in_headless then
+ Log:info "Reloaded configuration"
+ end
+ end)
end
---Reset any startup cache files used by Packer and Impatient
@@ -48,8 +56,8 @@ function M.run_post_update()
Log:debug "Starting post-update hook"
M.reset_cache()
- Log:debug "Updating core plugins"
- require("lvim.plugin-loader").ensure_installed()
+ Log:debug "Syncing core plugins"
+ require("lvim.plugin-loader").sync_core_plugins()
if not in_headless then
vim.schedule(function()