diff options
author | kylo252 <[email protected]> | 2022-01-03 15:49:07 +0100 |
---|---|---|
committer | kylo252 <[email protected]> | 2022-01-03 15:49:07 +0100 |
commit | e5aa8be8ce54097e4a34220cb2aad114e70f209b (patch) | |
tree | 15e0a3017358b15a0656b6d1f98d2638ae572095 /lua/lvim/utils | |
parent | 427ad868d404a254dcbc7d3950946dae0cf205de (diff) | |
parent | 21b41688ee8c5056ffbb2b07df141ce1ccb4b213 (diff) |
Merge branch 'rolling'
Diffstat (limited to 'lua/lvim/utils')
-rw-r--r-- | lua/lvim/utils/git.lua | 158 | ||||
-rw-r--r-- | lua/lvim/utils/hooks.lua | 8 | ||||
-rw-r--r-- | lua/lvim/utils/init.lua | 211 |
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 |