| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 | local M = {}local Log = require "lvim.core.log"local fmt = string.formatlocal if_nil = vim.F.if_nillocal function git_cmd(opts)  local plenary_loaded, Job = pcall(require, "plenary.job")  if not plenary_loaded then    return 1, { "" }  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, stderrendlocal function safe_deep_fetch()  local ret, result, error = git_cmd { args = { "rev-parse", "--is-shallow-repository" } }  if ret ~= 0 then    Log:error(vim.inspect(error))    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(fmt "Git fetch %s failed! Please pull the changes manually in %s", fetch_mode, get_lvim_base_dir())    return  end  if fetch_mode == "--unshallow" then    ret = git_cmd { args = { "remote", "set-branches", "origin", "*" } }    if ret ~= 0 then      Log:error(fmt "Git fetch %s failed! Please pull the changes manually in %s", fetch_mode, get_lvim_base_dir())      return    end  end  return trueend---pulls the latest changes from githubfunction M.update_base_lvim()  Log:info "Checking for updates"  if not vim.loop.fs_access(get_lvim_base_dir(), "w") then    Log:warn(fmt("Lunarvim update aborted! cannot write to %s", get_lvim_base_dir()))    return  end  if not safe_deep_fetch() then    return  end  local ret  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 in " .. get_lvim_base_dir())    return  end  return trueend---Switch Lunarvim to the specified development branch---@param branch stringfunction M.switch_lvim_branch(branch)  if not safe_deep_fetch() then    return  end  local args = { "switch", branch }  if branch:match "^[0-9]" then    -- avoids producing an error for tags    vim.list_extend(args, { "--detach" })  end  local ret = git_cmd { args = args }  if ret ~= 0 then    Log:error "Unable to switch branches! Check the log for further information"    return  end  return trueend---Get the current Lunarvim development branch---@return string|nilfunction M.get_lvim_branch()  local _, results = git_cmd { args = { "rev-parse", "--abbrev-ref", "HEAD" } }  local branch = if_nil(results[1], "")  return branchend---Get currently checked-out tag of Lunarvim---@return stringfunction M.get_lvim_tag()  local args = { "describe", "--tags", "--abbrev=0" }  local _, results = git_cmd { args = args }  local tag = if_nil(results[1], "")  return tagend---Get currently running version of Lunarvim---@return stringfunction M.get_lvim_version()  local current_branch = M.get_lvim_branch()  local lvim_version  if current_branch ~= "HEAD" or "" then    lvim_version = current_branch .. "-" .. M.get_lvim_current_sha()  else    lvim_version = "v" .. M.get_lvim_tag()  end  return lvim_versionend---Get the commit hash of currently checked-out commit of Lunarvim---@return string|nilfunction M.get_lvim_current_sha()  local _, log_results = git_cmd { args = { "log", "--pretty=format:%h", "-1" } }  local abbrev_version = if_nil(log_results[1], "")  return abbrev_versionendreturn M
 |