diff options
Diffstat (limited to 'lua/bootstrap.lua')
-rw-r--r-- | lua/bootstrap.lua | 96 |
1 files changed, 95 insertions, 1 deletions
diff --git a/lua/bootstrap.lua b/lua/bootstrap.lua index ff6d9cdf..7f8f97ed 100644 --- a/lua/bootstrap.lua +++ b/lua/bootstrap.lua @@ -1,5 +1,7 @@ local M = {} --- It's not safe to require 'utils' without adjusting the runtimepath + +---Join path segments that were passed as input +---@return string function _G.join_paths(...) local uv = vim.loop local path_sep = uv.os_uname().version:match "Windows" and "\\" or "/" @@ -7,6 +9,8 @@ function _G.join_paths(...) return result end +---Get the full path to `$LUNARVIM_RUNTIME_DIR` +---@return string function _G.get_runtime_dir() local lvim_runtime_dir = os.getenv "LUNARVIM_RUNTIME_DIR" if not lvim_runtime_dir then @@ -16,6 +20,8 @@ function _G.get_runtime_dir() return lvim_runtime_dir end +---Get the full path to `$LUNARVIM_CONFIG_DIR` +---@return string function _G.get_config_dir() local lvim_config_dir = os.getenv "LUNARVIM_CONFIG_DIR" if not lvim_config_dir then @@ -24,6 +30,8 @@ function _G.get_config_dir() return lvim_config_dir end +---Get the full path to `$LUNARVIM_CACHE_DIR` +---@return string function _G.get_cache_dir() local lvim_cache_dir = os.getenv "LUNARVIM_CACHE_DIR" if not lvim_cache_dir then @@ -32,7 +40,11 @@ function _G.get_cache_dir() return lvim_cache_dir end +---Get currently installed version of LunarVim +---@param type string can be "short" +---@return string function _G.get_version(type) + type = type or "" local lvim_full_ver = vim.fn.system("git -C " .. get_runtime_dir() .. "/lvim describe --tags") if string.match(lvim_full_ver, "%d") == nil then @@ -45,10 +57,13 @@ function _G.get_version(type) end end +---Initialize the `&runtimepath` variables and prepare for startup +---@return table function M:init() self.runtime_dir = get_runtime_dir() self.config_dir = get_config_dir() self.cache_path = get_cache_dir() + self.repo_dir = join_paths(self.runtime_dir, "lvim") self.pack_dir = join_paths(self.runtime_dir, "site", "pack") self.packer_install_dir = join_paths(self.runtime_dir, "site", "pack", "packer", "start", "packer.nvim") @@ -92,4 +107,83 @@ function M:init() return self end +---Update LunarVim +---pulls the latest changes from github and, resets the startup cache +function M:update() + M:update_repo() + M:reset_cache() + vim.schedule(function() + -- TODO: add a changelog + vim.notify("Update complete", vim.log.levels.INFO) + end) +end + +local function git_cmd(subcmd) + local Job = require "plenary.job" + local Log = require "core.log" + local repo_dir = join_paths(get_runtime_dir(), "lvim") + local args = { "-C", repo_dir } + vim.list_extend(args, subcmd) + + local stderr = {} + local stdout, ret = Job + :new({ + command = "git", + args = args, + cwd = repo_dir, + 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 +end + +---pulls the latest changes from github +function M:update_repo() + local Log = require "core.log" + local sub_commands = { + fetch = { "fetch" }, + diff = { "diff", "--quiet", "@{upstream}" }, + merge = { "merge", "--ff-only", "--progress" }, + } + Log:info "Checking for updates" + + local ret = git_cmd(sub_commands.fetch) + if ret ~= 0 then + error "Update failed! Check the log for further information" + end + + ret = git_cmd(sub_commands.diff) + + if ret == 0 then + Log:info "LunarVim is already up-to-date" + return + end + + ret = git_cmd(sub_commands.merge) + + if ret ~= 0 then + error "Error: unable to guarantee data integrity while updating your branch" + error "Please pull the changes manually instead." + end +end + +---Reset any startup cache files used by Packer and Impatient +---Tip: Useful for clearing any outdated settings +function M:reset_cache() + _G.__luacache.clear_cache() + _G.__luacache.save_cache() + require("plugin-loader"):cache_reset() +end + return M |