diff options
| author | William Boman <william@redwill.se> | 2022-05-13 20:53:04 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-05-13 20:53:04 +0200 |
| commit | 0ec5d1d7c56f870921aab329c163118c66434211 (patch) | |
| tree | 82728b4d9efd9f26306f47437ba93713a7d74596 /lua/nvim-lsp-installer | |
| parent | chore(issue_template): update neovim version placeholder (diff) | |
| download | mason-0ec5d1d7c56f870921aab329c163118c66434211.tar mason-0ec5d1d7c56f870921aab329c163118c66434211.tar.gz mason-0ec5d1d7c56f870921aab329c163118c66434211.tar.bz2 mason-0ec5d1d7c56f870921aab329c163118c66434211.tar.lz mason-0ec5d1d7c56f870921aab329c163118c66434211.tar.xz mason-0ec5d1d7c56f870921aab329c163118c66434211.tar.zst mason-0ec5d1d7c56f870921aab329c163118c66434211.zip | |
fix(github): allow looking for prereleases (#699)
Diffstat (limited to 'lua/nvim-lsp-installer')
| -rw-r--r-- | lua/nvim-lsp-installer/core/functional.lua | 59 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/core/managers/github/client.lua | 41 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/servers/vls/init.lua | 2 |
3 files changed, 87 insertions, 15 deletions
diff --git a/lua/nvim-lsp-installer/core/functional.lua b/lua/nvim-lsp-installer/core/functional.lua index 8b549fb6..8780c995 100644 --- a/lua/nvim-lsp-installer/core/functional.lua +++ b/lua/nvim-lsp-installer/core/functional.lua @@ -191,10 +191,69 @@ function functional.filter(filter_fn) return functional.partial(vim.tbl_filter, filter_fn) end +---@generic T +---@param fn fun(item: T, index: integer) +---@param list T[] function functional.each(fn, list) for k, v in pairs(list) do fn(v, k) end end +---@generic T +---@param predicates (fun(item: T): boolean)[] +---@return fun(item: T): boolean +function functional.all_pass(predicates) + return function(item) + for i = 1, #predicates do + if not predicates[i](item) then + return false + end + end + return true + end +end + +---@generic T +---@param predicate fun(item: T): boolean +---@return fun(item: T): boolean +function functional.negate(predicate) + return function(...) + return not predicate(...) + end +end + +---@param index any +---@return fun(obj: table): any +function functional.prop(index) + return function(obj) + return obj[index] + end +end + +---@param condition fun(...): boolean +---@param a fun(...): any +---@param b fun(...): any +---@return fun(...): any +function functional.if_else(condition, a, b) + return function(...) + if condition(...) then + return a(...) + else + return b(...) + end + end +end + +---@param pattern string +function functional.matches(pattern) + ---@param str string + return function(str) + return str:match(pattern) ~= nil + end +end + +functional.T = functional.always(true) +functional.F = functional.always(false) + return functional diff --git a/lua/nvim-lsp-installer/core/managers/github/client.lua b/lua/nvim-lsp-installer/core/managers/github/client.lua index e064f894..7387723c 100644 --- a/lua/nvim-lsp-installer/core/managers/github/client.lua +++ b/lua/nvim-lsp-installer/core/managers/github/client.lua @@ -3,7 +3,16 @@ 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 = functional.list_find_first +local list_find_first, all_pass, always, prop, negate, compose, if_else, matches, T = + functional.list_find_first, + functional.all_pass, + functional.always, + functional.prop, + functional.negate, + functional.compose, + functional.if_else, + functional.matches, + functional.T local M = {} @@ -45,7 +54,20 @@ function M.fetch_release(repo, tag_name) end) end ----@alias FetchLatestGithubReleaseOpts {tag_name_pattern:string|nil, include_prelease: boolean} +---@param opts {include_prerelease: boolean, tag_name_pattern: string} +function M.release_predicate(opts) + local is_not_draft = negate(prop "draft") + local is_not_prerelease = negate(prop "prerelease") + local tag_name_matches = compose(matches(opts.tag_name_pattern), prop "tag_name") + + return all_pass { + if_else(always(opts.include_prerelease), T, is_not_prerelease), + if_else(always(opts.tag_name_pattern), tag_name_matches, T), + is_not_draft, + } +end + +---@alias FetchLatestGithubReleaseOpts {tag_name_pattern:string|nil, include_prerelease: boolean} ---@async ---@param repo string @The GitHub repo ("username/repo"). @@ -54,23 +76,14 @@ end function M.fetch_latest_release(repo, opts) opts = opts or { tag_name_pattern = nil, - include_prelease = false, + include_prerelease = false, } return M.fetch_releases(repo):map_catching( ---@param releases GitHubRelease[] function(releases) + local is_stable_release = M.release_predicate(opts) ---@type GitHubRelease|nil - local latest_release = list_find_first( - ---@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, - releases - ) + local latest_release = list_find_first(is_stable_release, releases) if not latest_release then log.fmt_info("Failed to find latest release. repo=%s, opts=%s", repo, opts) diff --git a/lua/nvim-lsp-installer/servers/vls/init.lua b/lua/nvim-lsp-installer/servers/vls/init.lua index 7e3c9d8e..207cb819 100644 --- a/lua/nvim-lsp-installer/servers/vls/init.lua +++ b/lua/nvim-lsp-installer/servers/vls/init.lua @@ -20,7 +20,7 @@ return function(name, root_dir) ---@type GitHubRelease local latest_dev_build = - github_client.fetch_latest_release(repo, { include_prelease = true }):get_or_throw() + github_client.fetch_latest_release(repo, { include_prerelease = true }):get_or_throw() local source = github.release_file { version = Optional.of(latest_dev_build.tag_name), |
