diff options
| author | William Boman <william@redwill.se> | 2022-04-11 17:19:01 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-04-11 17:19:01 +0200 |
| commit | 88f590ce0e01767bcc8dfdc862a456efde77d4a0 (patch) | |
| tree | 2f5faaffa76b9147a873b2adc3286b6624144976 /lua/nvim-lsp-installer/core/managers/github | |
| parent | fix(verible): use correct unpacked directory name on Windows (#589) (diff) | |
| download | mason-88f590ce0e01767bcc8dfdc862a456efde77d4a0.tar mason-88f590ce0e01767bcc8dfdc862a456efde77d4a0.tar.gz mason-88f590ce0e01767bcc8dfdc862a456efde77d4a0.tar.bz2 mason-88f590ce0e01767bcc8dfdc862a456efde77d4a0.tar.lz mason-88f590ce0e01767bcc8dfdc862a456efde77d4a0.tar.xz mason-88f590ce0e01767bcc8dfdc862a456efde77d4a0.tar.zst mason-88f590ce0e01767bcc8dfdc862a456efde77d4a0.zip | |
more async refactor (#587)
Diffstat (limited to 'lua/nvim-lsp-installer/core/managers/github')
| -rw-r--r-- | lua/nvim-lsp-installer/core/managers/github/client.lua | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/lua/nvim-lsp-installer/core/managers/github/client.lua b/lua/nvim-lsp-installer/core/managers/github/client.lua new file mode 100644 index 00000000..a8766748 --- /dev/null +++ b/lua/nvim-lsp-installer/core/managers/github/client.lua @@ -0,0 +1,88 @@ +local Data = require "nvim-lsp-installer.data" +local log = require "nvim-lsp-installer.log" +local fetch = require "nvim-lsp-installer.core.fetch" +local spawn = require "nvim-lsp-installer.core.spawn" + +local list_find_first = Data.list_find_first + +local M = {} + +---@alias GitHubRelease {tag_name:string, prerelease: boolean, draft: boolean} +---@alias GitHubTag {name: string} + +---@async +---@param repo string The GitHub repo ("username/repo"). +function M.fetch_releases(repo) + log.fmt_trace("Fetching GitHub releases for repo=%s", repo) + local path = ("repos/%s/releases"):format(repo) + return spawn.gh({ "api", path }) + :map(function(result) + return result.stdout + end) + :recover_catching(function() + return fetch(("https://api.github.com/%s"):format(path)):get_or_throw() + end) + :map_catching(vim.json.decode) +end + +---@alias FetchLatestGithubReleaseOpts {tag_name_pattern:string} + +---@async +---@param repo string The GitHub repo ("username/repo"). +---@param opts FetchLatestGithubReleaseOpts|nil +---@return Result @of GitHubRelease +function M.fetch_latest_release(repo, opts) + opts = opts or {} + return M.fetch_releases(repo):map_catching( + ---@param releases GitHubRelease[] + function(releases) + ---@type GitHubRelease|nil + local latest_release = list_find_first( + releases, + ---@param release GitHubRelease + function(release) + local is_stable_release = not release.prerelease and not release.draft + if opts.tag_name_pattern then + return is_stable_release and release.tag_name:match(opts.tag_name_pattern) + end + return is_stable_release + end + ) + + if not latest_release then + log.fmt_info("Failed to find latest release. repo=%s, opts=%s", repo, opts) + error "Failed to find latest release." + end + + log.fmt_debug("Resolved latest version repo=%s, tag_name=%s", repo, latest_release.tag_name) + return latest_release + end + ) +end + +---@async +---@param repo string The GitHub repo ("username/repo"). +function M.fetch_tags(repo) + local path = ("repos/%s/tags"):format(repo) + return spawn.gh({ "api", path }) + :map(function(result) + return result.stdout + end) + :recover_catching(function() + return fetch(("https://api.github.com/%s"):format(path)):get_or_throw() + end) + :map_catching(vim.json.decode) +end + +---@async +---@param repo string The GitHub repo ("username/repo"). +function M.fetch_latest_tag(repo) + return M.fetch_tags(repo):map_catching(function(tags) + if vim.tbl_count(tags) == 0 then + error "No tags found." + end + return tags[1] + end) +end + +return M |
