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
|
local Data = require "nvim-lsp-installer.data"
local Result = require "nvim-lsp-installer.core.result"
local lazy = Data.lazy
local M = {}
local uname = vim.loop.os_uname()
---@alias Platform
---| '"win"'
---| '"unix"'
---| '"linux"'
---| '"mac"'
local arch_aliases = {
["x86_64"] = "x64",
["i386"] = "x86",
["i686"] = "x86", -- x86 compat
["aarch64"] = "arm64",
["aarch64_be"] = "arm64",
["armv8b"] = "arm64", -- arm64 compat
["armv8l"] = "arm64", -- arm64 compat
}
M.arch = arch_aliases[uname.machine] or uname.machine
M.is_win = vim.fn.has "win32" == 1
M.is_unix = vim.fn.has "unix" == 1
M.is_mac = vim.fn.has "mac" == 1
M.is_linux = not M.is_mac and M.is_unix
-- @return string @The libc found on the system, musl or glibc (glibc if ldd is not found)
function M.get_libc()
local _, _, libc_exit_code = os.execute "ldd --version 2>&1 | grep -q musl"
if libc_exit_code == 0 then
return "musl"
else
return "glibc"
end
end
-- PATH separator
M.path_sep = M.is_win and ";" or ":"
M.is_headless = #vim.api.nvim_list_uis() == 0
---@generic T
---@param platform_table table<Platform, T>
---@return T
local function get_by_platform(platform_table)
if M.is_mac then
return platform_table.mac or platform_table.unix
elseif M.is_linux then
return platform_table.linux or platform_table.unix
elseif M.is_unix then
return platform_table.unix
elseif M.is_win then
return platform_table.win
else
return nil
end
end
function M.when(cases)
local case = get_by_platform(cases)
if case then
return case()
else
error "Current platform is not supported."
end
end
---@type async fun(): table
M.os_distribution = lazy(function()
---Parses the provided contents of an /etc/\*-release file and identifies the Linux distribution.
---@param contents string @The contents of a /etc/\*-release file.
---@return table<string, any>
local function parse_linux_dist(contents)
local lines = vim.split(contents, "\n")
local entries = {}
for i = 1, #lines do
local line = lines[i]
local index = line:find "="
if index then
local key = line:sub(1, index - 1)
local value = line:sub(index + 1)
entries[key] = value
end
end
if entries.ID == "ubuntu" then
-- Parses the Ubuntu OS VERSION_ID into their version components, e.g. "18.04" -> {major=18, minor=04}
local version_id = entries.VERSION_ID:gsub([["]], "")
local version_parts = vim.split(version_id, "%.")
local major = tonumber(version_parts[1])
local minor = tonumber(version_parts[2])
return {
id = "ubuntu",
version_id = version_id,
version = { major = major, minor = minor },
}
else
return {
id = "linux-generic",
}
end
end
return M.when {
linux = function()
local spawn = require "nvim-lsp-installer.core.spawn"
return spawn.bash({ "-c", "cat /etc/*-release" })
:map_catching(function(result)
return parse_linux_dist(result.stdout)
end)
:recover(function()
return { id = "linux-generic" }
end)
:get_or_throw()
end,
mac = function()
return Result.success { id = "macOS" }
end,
win = function()
return Result.success { id = "windows" }
end,
}
end)
---@type async fun() Result @of String
M.get_homebrew_prefix = lazy(function()
assert(M.is_mac, "Can only locate Homebrew installation on Mac systems.")
local spawn = require "nvim-lsp-installer.core.spawn"
return spawn.brew({ "--prefix" })
:map_catching(function(result)
return vim.trim(result.stdout)
end)
:map_err(function()
return "Failed to locate Homebrew installation."
end)
end)
return M
|