summaryrefslogtreecommitdiff
path: root/lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua')
-rw-r--r--lua/bootstrap.lua96
-rw-r--r--lua/core/commands.lua2
-rw-r--r--lua/core/telescope.lua45
-rw-r--r--lua/core/which-key.lua5
-rw-r--r--lua/utils/init.lua14
5 files changed, 148 insertions, 14 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
diff --git a/lua/core/commands.lua b/lua/core/commands.lua
index 22170c85..f732c9a2 100644
--- a/lua/core/commands.lua
+++ b/lua/core/commands.lua
@@ -12,6 +12,8 @@ M.defaults = {
]],
-- :LvimInfo
[[command! LvimInfo lua require('core.info').toggle_popup(vim.bo.filetype)]],
+ [[ command! LvimCacheReset lua require('bootstrap').reset_cache() ]],
+ [[ command! LvimUpdate lua require('bootstrap').update() ]],
}
M.load = function(commands)
diff --git a/lua/core/telescope.lua b/lua/core/telescope.lua
index e24a976e..eba27eec 100644
--- a/lua/core/telescope.lua
+++ b/lua/core/telescope.lua
@@ -114,6 +114,51 @@ function M.grep_lunarvim_files(opts)
require("telescope.builtin").live_grep(opts)
end
+function M.view_lunarvim_changelog()
+ local finders = require "telescope.finders"
+ local make_entry = require "telescope.make_entry"
+ local pickers = require "telescope.pickers"
+ local previewers = require "telescope.previewers"
+ local actions = require "telescope.actions"
+ local opts = {}
+
+ local conf = require("telescope.config").values
+ opts.entry_maker = make_entry.gen_from_git_commits(opts)
+
+ pickers.new(opts, {
+ prompt_title = "LunarVim changelog",
+
+ finder = finders.new_oneshot_job(
+ vim.tbl_flatten {
+ "git",
+ "log",
+ "--pretty=oneline",
+ "--abbrev-commit",
+ "--",
+ ".",
+ },
+ opts
+ ),
+ previewer = {
+ previewers.git_commit_diff_to_parent.new(opts),
+ previewers.git_commit_diff_to_head.new(opts),
+ previewers.git_commit_diff_as_was.new(opts),
+ previewers.git_commit_message.new(opts),
+ },
+
+ --TODO: consider opening a diff view when pressing enter
+ attach_mappings = function(_, map)
+ map("i", "<enter>", actions._close)
+ map("n", "<enter>", actions._close)
+ map("i", "<esc>", actions._close)
+ map("n", "<esc>", actions._close)
+ map("n", "q", actions._close)
+ return true
+ end,
+ sorter = conf.file_sorter(opts),
+ }):find()
+end
+
function M.setup()
local telescope = require "telescope"
diff --git a/lua/core/which-key.lua b/lua/core/which-key.lua
index 36949467..2e528048 100644
--- a/lua/core/which-key.lua
+++ b/lua/core/which-key.lua
@@ -192,6 +192,10 @@ M.config = function()
"<cmd>lua require('core.info').toggle_popup(vim.bo.filetype)<cr>",
"Toggle LunarVim Info",
},
+ I = {
+ "<cmd>lua require('core.telescope').view_lunarvim_changelog()<cr>",
+ "View LunarVim's changelog",
+ },
l = {
name = "+logs",
d = {
@@ -210,6 +214,7 @@ M.config = function()
P = { "<cmd>exe 'edit '.stdpath('cache').'/packer.nvim.log'<cr>", "Open the Packer logfile" },
},
r = { "<cmd>lua require('utils').reload_lv_config()<cr>", "Reload configurations" },
+ u = { "<cmd>LvimUpdate<cr>", "Update LunarVim" },
},
s = {
name = "Search",
diff --git a/lua/utils/init.lua b/lua/utils/init.lua
index 5a5e4ba3..7f8e1f77 100644
--- a/lua/utils/init.lua
+++ b/lua/utils/init.lua
@@ -140,19 +140,7 @@ function utils.is_file(filename)
return stat and stat.type == "file" or false
end
-function utils.join_paths(...)
- local path_sep = vim.loop.os_uname().version:match "Windows" and "\\" or "/"
- local result = table.concat(vim.tbl_flatten { ... }, path_sep):gsub(path_sep .. "+", path_sep)
- return result
-end
-
-function utils.lvim_cache_reset()
- _G.__luacache.clear_cache()
- _G.__luacache.save_cache()
- require("plugin-loader"):cache_reset()
-end
-
-vim.cmd [[ command! LvimCacheReset lua require('utils').lvim_cache_reset() ]]
+utils.join_paths = _G.join_paths
return utils