summaryrefslogtreecommitdiff
path: root/lua/lvim/utils
diff options
context:
space:
mode:
Diffstat (limited to 'lua/lvim/utils')
-rw-r--r--lua/lvim/utils/git.lua158
-rw-r--r--lua/lvim/utils/hooks.lua8
-rw-r--r--lua/lvim/utils/init.lua211
3 files changed, 162 insertions, 215 deletions
diff --git a/lua/lvim/utils/git.lua b/lua/lvim/utils/git.lua
new file mode 100644
index 00000000..73ba7c96
--- /dev/null
+++ b/lua/lvim/utils/git.lua
@@ -0,0 +1,158 @@
+local M = {}
+
+local Log = require "lvim.core.log"
+
+local function git_cmd(opts)
+ local plenary_loaded, Job = pcall(require, "plenary.job")
+ if not plenary_loaded then
+ vim.cmd "packadd plenary.nvim"
+ end
+
+ opts = opts or {}
+ opts.cwd = opts.cwd or get_lvim_base_dir()
+
+ local stderr = {}
+ local stdout, ret = Job
+ :new({
+ command = "git",
+ args = opts.args,
+ cwd = opts.cwd,
+ on_stderr = function(_, data)
+ table.insert(stderr, data)
+ end,
+ })
+ :sync()
+
+ if not vim.tbl_isempty(stderr) then
+ Log:debug(stderr)
+ end
+
+ if not vim.tbl_isempty(stdout) then
+ Log:debug(stdout)
+ end
+
+ return ret, stdout
+end
+
+local function safe_deep_fetch()
+ local ret, result = git_cmd { args = { "rev-parse", "--is-shallow-repository" } }
+ if ret ~= 0 then
+ Log:error "Git fetch failed! Check the log for further information"
+ return
+ end
+ -- git fetch --unshallow will cause an error on a 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! Check the log for further information"
+ return
+ end
+ return true
+end
+
+---pulls the latest changes from github
+function M.update_base_lvim()
+ Log:info "Checking for updates"
+
+ local ret = git_cmd { args = { "fetch" } }
+ if ret ~= 0 then
+ Log:error "Update failed! Check the log for further information"
+ return
+ end
+
+ ret = git_cmd { args = { "diff", "--quiet", "@{upstream}" } }
+ if ret == 0 then
+ Log:info "LunarVim is already up-to-date"
+ return
+ end
+
+ ret = git_cmd { args = { "merge", "--ff-only", "--progress" } }
+ if ret ~= 0 then
+ Log:error "Update failed! Please pull the changes manually instead."
+ return
+ end
+end
+
+---Switch Lunarvim to the specified development branch
+---@param branch string
+function M.switch_lvim_branch(branch)
+ if not safe_deep_fetch() then
+ return
+ end
+ local ret = git_cmd { args = { "switch", branch } }
+ if ret ~= 0 then
+ Log:error "Unable to switch branches! Check the log for further information"
+ return
+ end
+end
+
+---Get the current Lunarvim development branch
+---@return string|nil
+function M.get_lvim_branch()
+ local ret, branch = git_cmd { args = { "branch", "--show-current" } }
+ if ret ~= 0 or (not branch or branch[1] == "") then
+ Log:error "Unable to retrieve the name of the current branch. Check the log for further information"
+ return
+ end
+ return branch[1]
+end
+
+---Get currently checked-out tag of Lunarvim
+---@param type string can be "short"
+---@return string|nil
+function M.get_lvim_tag(type)
+ type = type or ""
+ local ret, results = git_cmd { args = { "describe", "--tags" } }
+ local lvim_full_ver = results[1] or ""
+
+ if ret ~= 0 or string.match(lvim_full_ver, "%d") == nil then
+ Log:error "Unable to retrieve current tag. Check the log for further information"
+ return nil
+ end
+ if type == "short" then
+ return vim.fn.split(lvim_full_ver, "-")[1]
+ else
+ return string.sub(lvim_full_ver, 1, #lvim_full_ver - 1)
+ end
+end
+
+---Get the commit hash of currently checked-out commit of Lunarvim
+---@param type string can be "short"
+---@return string|nil
+function M.get_lvim_version(type)
+ type = type or ""
+ local branch = M.get_lvim_branch()
+ if branch == "master" then
+ return M.get_lvim_tag(type)
+ end
+ local ret, log_results = git_cmd { args = { "log", "--pretty=format:%h", "-1" } }
+ local abbrev_version = log_results[1] or ""
+ if ret ~= 0 or string.match(abbrev_version, "%d") == nil then
+ Log:error "Unable to retrieve current version. Check the log for further information"
+ return nil
+ end
+ if type == "short" then
+ return abbrev_version
+ end
+ return branch .. "-" .. 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 9b02b958..ab7dfacd 100644
--- a/lua/lvim/utils/hooks.lua
+++ b/lua/lvim/utils/hooks.lua
@@ -21,14 +21,14 @@ function M.run_on_packer_complete()
require("lvim.plugin-loader").recompile()
-- forcefully activate nvim-web-devicons
require("nvim-web-devicons").set_up_highlights()
+ if package.loaded["lspconfig"] then
+ vim.cmd [[ LspStart ]]
+ end
Log:info "Reloaded configuration"
end
function M.run_post_reload()
Log:debug "Starting post-reload hook"
- if package.loaded["lspconfig"] then
- vim.cmd [[ LspRestart ]]
- end
M.reset_cache()
require("lvim.plugin-loader").ensure_installed()
@@ -68,7 +68,7 @@ function M.run_post_update()
-- TODO: add a changelog
vim.notify("Update complete", vim.log.levels.INFO)
if package.loaded["lspconfig"] then
- vim.cmd [[ LspRestart ]]
+ vim.cmd [[ LspStart ]]
end
end)
end
diff --git a/lua/lvim/utils/init.lua b/lua/lvim/utils/init.lua
deleted file mode 100644
index cafcf506..00000000
--- a/lua/lvim/utils/init.lua
+++ /dev/null
@@ -1,211 +0,0 @@
-local utils = {}
-local uv = vim.loop
-
--- recursive Print (structure, limit, separator)
-local function r_inspect_settings(structure, limit, separator)
- limit = limit or 100 -- default item limit
- separator = separator or "." -- indent string
- if limit < 1 then
- print "ERROR: Item limit reached."
- return limit - 1
- end
- if structure == nil then
- io.write("-- O", separator:sub(2), " = nil\n")
- return limit - 1
- end
- local ts = type(structure)
-
- if ts == "table" then
- for k, v in pairs(structure) do
- -- replace non alpha keys with ["key"]
- if tostring(k):match "[^%a_]" then
- k = '["' .. tostring(k) .. '"]'
- end
- limit = r_inspect_settings(v, limit, separator .. "." .. tostring(k))
- if limit < 0 then
- break
- end
- end
- return limit
- end
-
- if ts == "string" then
- -- escape sequences
- structure = string.format("%q", structure)
- end
- separator = separator:gsub("%.%[", "%[")
- if type(structure) == "function" then
- -- don't print functions
- io.write("-- lvim", separator:sub(2), " = function ()\n")
- else
- io.write("lvim", separator:sub(2), " = ", tostring(structure), "\n")
- end
- return limit - 1
-end
-
-function utils.generate_settings()
- -- Opens a file in append mode
- local file = io.open("lv-settings.lua", "w")
-
- -- sets the default output file as test.lua
- io.output(file)
-
- -- write all `lvim` related settings to `lv-settings.lua` file
- r_inspect_settings(lvim, 10000, ".")
-
- -- closes the open file
- io.close(file)
-end
-
-function utils.unrequire(m)
- package.loaded[m] = nil
- _G[m] = nil
-end
-
-function utils.gsub_args(args)
- if args == nil or type(args) ~= "table" then
- return args
- end
- local buffer_filepath = vim.fn.fnameescape(vim.api.nvim_buf_get_name(0))
- for i = 1, #args do
- args[i] = string.gsub(args[i], "${FILEPATH}", buffer_filepath)
- end
- return args
-end
-
---- Returns a table with the default values that are missing.
---- either paramter can be empty.
---@param config (table) table containing entries that take priority over defaults
---@param default_config (table) table contatining default values if found
-function utils.apply_defaults(config, default_config)
- config = config or {}
- default_config = default_config or {}
- local new_config = vim.tbl_deep_extend("keep", vim.empty_dict(), config)
- new_config = vim.tbl_deep_extend("keep", new_config, default_config)
- return new_config
-end
-
---- Checks whether a given path exists and is a file.
---@param path (string) path to check
---@returns (bool)
-function utils.is_file(path)
- local stat = uv.fs_stat(path)
- return stat and stat.type == "file" or false
-end
-
---- Checks whether a given path exists and is a directory
---@param path (string) path to check
---@returns (bool)
-function utils.is_directory(path)
- local stat = uv.fs_stat(path)
- return stat and stat.type == "directory" or false
-end
-
-utils.join_paths = _G.join_paths
-
-function utils.write_file(path, txt, flag)
- uv.fs_open(path, flag, 438, function(open_err, fd)
- assert(not open_err, open_err)
- uv.fs_write(fd, txt, -1, function(write_err)
- assert(not write_err, write_err)
- uv.fs_close(fd, function(close_err)
- assert(not close_err, close_err)
- end)
- end)
- end)
-end
-
-function utils.debounce(ms, fn)
- local timer = vim.loop.new_timer()
- return function(...)
- local argv = { ... }
- timer:start(ms, 0, function()
- timer:stop()
- vim.schedule_wrap(fn)(unpack(argv))
- end)
- end
-end
-
-function utils.search_file(file, args)
- local Job = require "plenary.job"
- local stderr = {}
- local stdout, ret = Job
- :new({
- command = "grep",
- args = { args, file },
- cwd = get_cache_dir(),
- on_stderr = function(_, data)
- table.insert(stderr, data)
- end,
- })
- :sync()
- return stdout, ret, stderr
-end
-
-function utils.file_contains(file, query)
- local stdout, ret, stderr = utils.search_file(file, query)
- if ret == 0 then
- return true
- end
- if not vim.tbl_isempty(stderr) then
- error(vim.inspect(stderr))
- end
- if not vim.tbl_isempty(stdout) then
- error(vim.inspect(stdout))
- end
- return false
-end
-
-function utils.log_contains(query)
- local logfile = require("lvim.core.log"):get_path()
- local stdout, ret, stderr = utils.search_file(logfile, query)
- if ret == 0 then
- return true
- end
- if not vim.tbl_isempty(stderr) then
- error(vim.inspect(stderr))
- end
- if not vim.tbl_isempty(stdout) then
- error(vim.inspect(stdout))
- end
- if not vim.tbl_isempty(stderr) then
- error(vim.inspect(stderr))
- end
- return false
-end
-
-function utils.generate_plugins_sha(output)
- local list = {}
- output = output or "commits.lua"
-
- local function git_cmd(args)
- local Job = require "plenary.job"
- local stderr = {}
- local stdout, ret = Job
- :new({
- command = "git",
- args = args,
- on_stderr = function(_, data)
- table.insert(stderr, data)
- end,
- })
- :sync()
- return ret, stdout
- end
-
- 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 { "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
- utils.write_file(output, "local commit = " .. vim.inspect(list), "w")
-end
-
-return utils