summaryrefslogtreecommitdiff
path: root/lua/bootstrap.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua/bootstrap.lua')
-rw-r--r--lua/bootstrap.lua96
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