1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
local M = {}
local Log = require "lvim.core.log"
local fmt = string.format
local if_nil = vim.F.if_nil
local 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, stderr
end
local 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 true
end
---pulls the latest changes from github
function 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 true
end
---Switch Lunarvim to the specified development branch
---@param branch string
function 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 true
end
---Get the current Lunarvim development branch
---@return string|nil
function M.get_lvim_branch()
local _, results = git_cmd { args = { "rev-parse", "--abbrev-ref", "HEAD" } }
local branch = if_nil(results[1], "")
return branch
end
---Get currently checked-out tag of Lunarvim
---@return string
function M.get_lvim_tag()
local args = { "describe", "--tags", "--abbrev=0" }
local _, results = git_cmd { args = args }
local tag = if_nil(results[1], "")
return tag
end
---Get currently running version of Lunarvim
---@return string
function 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_version
end
---Get the commit hash of currently checked-out commit of Lunarvim
---@return string|nil
function 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_version
end
return M
|