| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 | 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, stdoutendlocal 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 trueend---pulls the latest changes from githubfunction 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  endend---Switch Lunarvim to the specified development branch---@param branch stringfunction 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  endend---Get the current Lunarvim development branch---@return string|nilfunction 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|nilfunction 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)  endend---Get the commit hash of currently checked-out commit of Lunarvim---@param type string can be "short"---@return string|nilfunction 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_versionendfunction 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")endreturn M
 |