aboutsummaryrefslogtreecommitdiffstats
path: root/lua/nvim-lsp-installer
diff options
context:
space:
mode:
authorWilliam Boman <william@redwill.se>2022-05-13 20:53:04 +0200
committerGitHub <noreply@github.com>2022-05-13 20:53:04 +0200
commit0ec5d1d7c56f870921aab329c163118c66434211 (patch)
tree82728b4d9efd9f26306f47437ba93713a7d74596 /lua/nvim-lsp-installer
parentchore(issue_template): update neovim version placeholder (diff)
downloadmason-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.lua59
-rw-r--r--lua/nvim-lsp-installer/core/managers/github/client.lua41
-rw-r--r--lua/nvim-lsp-installer/servers/vls/init.lua2
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),