aboutsummaryrefslogtreecommitdiffstats
path: root/lua/nvim-lsp-installer/installers/context.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua/nvim-lsp-installer/installers/context.lua')
-rw-r--r--lua/nvim-lsp-installer/installers/context.lua285
1 files changed, 0 insertions, 285 deletions
diff --git a/lua/nvim-lsp-installer/installers/context.lua b/lua/nvim-lsp-installer/installers/context.lua
deleted file mode 100644
index 14789959..00000000
--- a/lua/nvim-lsp-installer/installers/context.lua
+++ /dev/null
@@ -1,285 +0,0 @@
-require "nvim-lsp-installer.notify"(
- (
- "%s has been deprecated. See https://github.com/williamboman/nvim-lsp-installer/wiki/Async-infrastructure-changes-notice"
- ):format "nvim-lsp-installer.installers.context",
- vim.log.levels.WARN
-)
-
-local a = require "nvim-lsp-installer.core.async"
-local log = require "nvim-lsp-installer.log"
-local process = require "nvim-lsp-installer.process"
-local installers = require "nvim-lsp-installer.installers"
-local platform = require "nvim-lsp-installer.platform"
-local fs = require "nvim-lsp-installer.fs"
-local path = require "nvim-lsp-installer.path"
-local github_client = require "nvim-lsp-installer.core.managers.github.client"
-
-local M = {}
-
----@param repo string @The GitHub repo ("username/repo").
-function M.use_github_latest_tag(repo)
- ---@type ServerInstallerFunction
- return function(_, callback, context)
- context.github_repo = repo
- if context.requested_server_version then
- log.fmt_debug(
- "Requested server version already provided (%s), skipping fetching tags from GitHub.",
- context.requested_server_version
- )
- -- User has already provided a version - don't fetch the tags from GitHub
- return callback(true)
- end
- context.stdio_sink.stdout "Fetching tags from GitHub API...\n"
- a.run(github_client.fetch_latest_tag, function(success, result)
- if not success then
- context.stdio_sink.stderr(tostring(result) .. "\n")
- return callback(false)
- end
- result
- :on_success(function(latest_tag)
- context.requested_server_version = latest_tag.name
- callback(true)
- end)
- :on_failure(function(failure)
- context.stdio_sink.stderr(tostring(failure) .. "\n")
- callback(false)
- end)
- end, repo)
- end
-end
-
----@param repo string @The GitHub repo ("username/repo").
----@param opts FetchLatestGithubReleaseOpts|nil
-function M.use_github_release(repo, opts)
- opts = opts or {}
- ---@type ServerInstallerFunction
- return function(_, callback, context)
- context.github_repo = repo
- if context.requested_server_version then
- log.fmt_debug(
- "Requested server version already provided (%s), skipping fetching latest release from GitHub.",
- context.requested_server_version
- )
- -- User has already provided a version - don't fetch the latest version from GitHub
- return callback(true)
- end
- context.stdio_sink.stdout "Fetching latest release version from GitHub API...\n"
- a.run(github_client.fetch_latest_release, function(success, result)
- if not success then
- context.stdio_sink.stderr(tostring(result) .. "\n")
- return callback(false)
- end
- result
- :on_success(function(latest_release)
- context.requested_server_version = latest_release.tag_name
- callback(true)
- end)
- :on_failure(function(failure)
- context.stdio_sink.stderr(tostring(failure) .. "\n")
- callback(false)
- end)
- end, repo, opts)
- end
-end
-
----@param repo string @The GitHub report ("username/repo").
----@param file string|fun(resolved_version: string): string @The name of a file available in the provided repo's GitHub releases.
----@param opts FetchLatestGithubReleaseOpts
-function M.use_github_release_file(repo, file, opts)
- return installers.pipe {
- M.use_github_release(repo, opts),
- function(server, callback, context)
- local function get_download_url(version)
- local target_file
- if type(file) == "function" then
- target_file = file(version)
- else
- target_file = file
- end
- if not target_file then
- log.fmt_error(
- "Unable to find which release file to download. server_name=%s, repo=%s",
- server.name,
- repo
- )
- context.stdio_sink.stderr(
- (
- "Could not find which release file to download. Most likely the current operating system, architecture (%s), or libc (%s) is not supported.\n"
- ):format(platform.arch, platform.get_libc())
- )
- return nil
- end
-
- return ("https://github.com/%s/releases/download/%s/%s"):format(repo, version, target_file)
- end
-
- local download_url = get_download_url(context.requested_server_version)
- if not download_url then
- return callback(false)
- end
- context.github_release_file = download_url
- callback(true)
- end,
- }
-end
-
----Creates an installer that moves the current installation directory to the server's root directory.
-function M.promote_install_dir()
- ---@type ServerInstallerFunction
- return vim.schedule_wrap(function(server, callback, context)
- if server:promote_install_dir(context.install_dir) then
- context.install_dir = server.root_dir
- callback(true)
- else
- context.stdio_sink.stderr(
- ("Failed to promote temporary install directory to %s.\n"):format(server.root_dir)
- )
- callback(false)
- end
- end)
-end
-
----Access the context ojbect to create a new installer.
----@param fn fun(context: ServerInstallContext): ServerInstallerFunction
-function M.capture(fn)
- ---@type ServerInstallerFunction
- return function(server, callback, context)
- local installer = fn(context)
- installer(server, callback, context)
- end
-end
-
----@param fn fun(receipt_builder: InstallReceiptBuilder, ctx: ServerInstallContext)
-function M.receipt(fn)
- return M.capture(function(ctx)
- fn(ctx.receipt, ctx)
- return installers.noop
- end)
-end
-
----Update the context object.
----@param fn fun(context: ServerInstallContext): ServerInstallerFunction
-function M.set(fn)
- ---@type ServerInstallerFunction
- return function(_, callback, context)
- fn(context)
- callback(true)
- end
-end
-
----@param rel_path string @The relative path from the current installation working directory.
-function M.set_working_dir(rel_path)
- ---@type ServerInstallerFunction
- return vim.schedule_wrap(function(server, callback, context)
- local new_dir = path.concat { context.install_dir, rel_path }
- log.fmt_debug(
- "Changing installation working directory for %s from %s to %s",
- server.name,
- context.install_dir,
- new_dir
- )
- if not fs.dir_exists(new_dir) then
- local ok = pcall(fs.mkdirp, new_dir)
- if not ok then
- context.stdio_sink.stderr(("Failed to create directory %s.\n"):format(new_dir))
- return callback(false)
- end
- end
- context.install_dir = new_dir
- callback(true)
- end)
-end
-
-function M.use_os_distribution()
- ---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 installers.when {
- ---@type ServerInstallerFunction
- linux = function(_, callback, ctx)
- local stdio = process.in_memory_sink()
- process.spawn("bash", {
- args = { "-c", "cat /etc/*-release" },
- stdio_sink = stdio.sink,
- }, function(success)
- if success then
- ctx.os_distribution = parse_linux_dist(table.concat(stdio.buffers.stdout, ""))
- callback(true)
- else
- ctx.os_distribution = {
- id = "linux-generic",
- }
- callback(true)
- end
- end)
- end,
- mac = function(_, callback, ctx)
- ctx.os_distribution = {
- id = "macOS",
- }
- callback(true)
- end,
- win = function(_, callback, ctx)
- ctx.os_distribution = {
- id = "windows",
- }
- callback(true)
- end,
- }
-end
-
-function M.use_homebrew_prefix()
- return installers.on {
- mac = function(_, callback, ctx)
- local stdio = process.in_memory_sink()
- process.spawn("brew", {
- args = { "--prefix" },
- stdio_sink = stdio.sink,
- }, function(success)
- if success then
- ctx.homebrew_prefix = vim.trim(table.concat(stdio.buffers.stdout, ""))
- callback(true)
- else
- ctx.stdio_sink.stderr "Failed to locate Homebrew installation.\n"
- callback(false)
- end
- end)
- end,
- }
-end
-
-return M