summaryrefslogtreecommitdiff
path: root/lua/lvim/utils
diff options
context:
space:
mode:
Diffstat (limited to 'lua/lvim/utils')
-rw-r--r--lua/lvim/utils/functions.lua13
-rw-r--r--lua/lvim/utils/git.lua17
-rw-r--r--lua/lvim/utils/hooks.lua15
-rw-r--r--lua/lvim/utils/modules.lua98
4 files changed, 132 insertions, 11 deletions
diff --git a/lua/lvim/utils/functions.lua b/lua/lvim/utils/functions.lua
index de46bc8a..1cb8ec8e 100644
--- a/lua/lvim/utils/functions.lua
+++ b/lua/lvim/utils/functions.lua
@@ -16,4 +16,17 @@ function M.smart_quit()
end
end
+function M.isempty(s)
+ return s == nil or s == ""
+end
+
+function M.get_buf_option(opt)
+ local status_ok, buf_option = pcall(vim.api.nvim_buf_get_option, 0, opt)
+ if not status_ok then
+ return nil
+ else
+ return buf_option
+ end
+end
+
return M
diff --git a/lua/lvim/utils/git.lua b/lua/lvim/utils/git.lua
index 99c178f3..c1bdca1b 100644
--- a/lua/lvim/utils/git.lua
+++ b/lua/lvim/utils/git.lua
@@ -1,6 +1,7 @@
local M = {}
local Log = require "lvim.core.log"
+local fmt = string.format
local if_nil = vim.F.if_nil
local function git_cmd(opts)
@@ -39,13 +40,20 @@ local function safe_deep_fetch()
Log:error(vim.inspect(error))
return
end
- -- git fetch --unshallow will cause an error on a a complete clone
+ -- git fetch --unshallow will cause an error on a complete clone
local fetch_mode = result[1] == "true" and "--unshallow" or "--all"
ret = git_cmd { args = { "fetch", fetch_mode } }
if ret ~= 0 then
- Log:error("Git fetch failed! Please pull the changes manually in " .. get_lvim_base_dir())
+ Log:error(fmt "Git fetch %s failed! Please pull the changes manually in %s", fetch_mode, get_lvim_base_dir())
return
end
+ if fetch_mode == "--unshallow" then
+ ret = git_cmd { args = { "remote", "set-branches", "origin", "*" } }
+ if ret ~= 0 then
+ Log:error(fmt "Git fetch %s failed! Please pull the changes manually in %s", fetch_mode, get_lvim_base_dir())
+ return
+ end
+ end
return true
end
@@ -53,6 +61,11 @@ end
function M.update_base_lvim()
Log:info "Checking for updates"
+ if not vim.loop.fs_access(get_lvim_base_dir(), "w") then
+ Log:warn(fmt("Lunarvim update aborted! cannot write to %s", get_lvim_base_dir()))
+ return
+ end
+
if not safe_deep_fetch() then
return
end
diff --git a/lua/lvim/utils/hooks.lua b/lua/lvim/utils/hooks.lua
index f15f6729..bf0dac60 100644
--- a/lua/lvim/utils/hooks.lua
+++ b/lua/lvim/utils/hooks.lua
@@ -19,7 +19,7 @@ function M.run_on_packer_complete()
pcall(vim.cmd, "colorscheme " .. lvim.colorscheme)
if M._reload_triggered then
- Log:info "Reloaded configuration"
+ Log:debug "Reloaded configuration"
M._reload_triggered = nil
end
end
@@ -34,10 +34,7 @@ end
---It also forces regenerating any template ftplugin files
---Tip: Useful for clearing any outdated settings
function M.reset_cache()
- local impatient = _G.__luacache
- if impatient then
- impatient.clear_cache()
- end
+ vim.cmd [[LuaCacheClear]]
local lvim_modules = {}
for module, _ in pairs(package.loaded) do
if module:match "lvim.core" or module:match "lvim.lsp" then
@@ -52,8 +49,8 @@ end
function M.run_post_update()
Log:debug "Starting post-update hook"
- if vim.fn.has "nvim-0.7" ~= 1 then
- local compat_tag = "1.1.3"
+ if vim.fn.has "nvim-0.8" ~= 1 then
+ local compat_tag = "1.1.4"
vim.notify(
"Please upgrade your Neovim base installation. Newer version of Lunarvim requires v0.7+",
vim.log.levels.WARN
@@ -61,9 +58,9 @@ function M.run_post_update()
vim.wait(1000, function()
return false
end)
- local ret = require_clean("lvim.utils.git").switch_lvim_branch(compat_tag)
+ local ret = reload("lvim.utils.git").switch_lvim_branch(compat_tag)
if ret then
- vim.notify("Reverted to the last known compatibile version: " .. compat_tag, vim.log.levels.WARN)
+ vim.notify("Reverted to the last known compatible version: " .. compat_tag, vim.log.levels.WARN)
end
return
end
diff --git a/lua/lvim/utils/modules.lua b/lua/lvim/utils/modules.lua
new file mode 100644
index 00000000..d5674483
--- /dev/null
+++ b/lua/lvim/utils/modules.lua
@@ -0,0 +1,98 @@
+local M = {}
+
+local Log = require "lvim.core.log"
+-- revisit this
+-- function prequire(package)
+-- local status, lib = pcall(require, package)
+-- if status then
+-- return lib
+-- else
+-- vim.notify("Failed to require '" .. package .. "' from " .. debug.getinfo(2).source)
+-- return nil
+-- end
+-- end
+
+local function _assign(old, new, k)
+ local otype = type(old[k])
+ local ntype = type(new[k])
+ -- print("hi")
+ if (otype == "thread" or otype == "userdata") or (ntype == "thread" or ntype == "userdata") then
+ vim.notify(string.format("warning: old or new attr %s type be thread or userdata", k))
+ end
+ old[k] = new[k]
+end
+
+local function _replace(old, new, repeat_tbl)
+ if repeat_tbl[old] then
+ return
+ end
+ repeat_tbl[old] = true
+
+ local dellist = {}
+ for k, _ in pairs(old) do
+ if not new[k] then
+ table.insert(dellist, k)
+ end
+ end
+ for _, v in ipairs(dellist) do
+ old[v] = nil
+ end
+
+ for k, _ in pairs(new) do
+ if not old[k] then
+ old[k] = new[k]
+ else
+ if type(old[k]) ~= type(new[k]) then
+ Log:debug(
+ string.format("Reloader: mismatch between old [%s] and new [%s] type for [%s]", type(old[k]), type(new[k]), k)
+ )
+ _assign(old, new, k)
+ else
+ if type(old[k]) == "table" then
+ _replace(old[k], new[k], repeat_tbl)
+ else
+ _assign(old, new, k)
+ end
+ end
+ end
+ end
+end
+
+M.require_clean = function(m)
+ package.loaded[m] = nil
+ _G[m] = nil
+ local _, module = pcall(require, m)
+ return module
+end
+
+M.require_safe = function(mod)
+ local status_ok, module = pcall(require, mod)
+ if not status_ok then
+ local trace = debug.getinfo(2, "SL")
+ local shorter_src = trace.short_src
+ local lineinfo = shorter_src .. ":" .. (trace.currentline or trace.linedefined)
+ local msg = string.format("%s : skipped loading [%s]", lineinfo, mod)
+ Log:debug(msg)
+ end
+ return module
+end
+
+M.reload = function(mod)
+ if not package.loaded[mod] then
+ return M.require_safe(mod)
+ end
+
+ local old = package.loaded[mod]
+ package.loaded[mod] = nil
+ local new = M.require_safe(mod)
+
+ if type(old) == "table" and type(new) == "table" then
+ local repeat_tbl = {}
+ _replace(old, new, repeat_tbl)
+ end
+
+ package.loaded[mod] = old
+ return old
+end
+
+return M