diff options
| -rw-r--r-- | lua/mason-core/managers/github/client.lua | 51 | ||||
| -rw-r--r-- | lua/mason-core/managers/github/init.lua | 15 | ||||
| -rw-r--r-- | lua/mason-registry/index/vls/init.lua | 1 | ||||
| -rw-r--r-- | lua/mason/providers/client/gh.lua | 19 | ||||
| -rw-r--r-- | tests/mason-core/managers/github_spec.lua | 26 |
5 files changed, 40 insertions, 72 deletions
diff --git a/lua/mason-core/managers/github/client.lua b/lua/mason-core/managers/github/client.lua index 03e6a10e..06130e36 100644 --- a/lua/mason-core/managers/github/client.lua +++ b/lua/mason-core/managers/github/client.lua @@ -1,12 +1,11 @@ local _ = require "mason-core.functional" local fetch = require "mason-core.fetch" -local log = require "mason-core.log" -local providers = require "mason-core.providers" local spawn = require "mason-core.spawn" local M = {} ----@alias GitHubCommit {sha: string} +---@alias GitHubCommit { sha: string } +---@alias GitHubRef { ref: string } local stringify_params = _.compose(_.join "&", _.map(_.join "="), _.sort_by(_.head), _.to_pairs) @@ -21,12 +20,12 @@ local function gh_api_call(path, opts) return spawn .gh({ "api", path, env = { CLICOLOR_FORCE = 0 } }) :map(_.prop "stdout") - :recover_catching(function() + :or_else(function() return fetch(("https://api.github.com/%s"):format(path), { headers = { Accept = "application/vnd.github.v3+json; q=1.0, application/json; q=0.8", }, - }):get_or_throw() + }) end) :map_catching(vim.json.decode) end @@ -35,48 +34,26 @@ M.api_call = gh_api_call ---@async ---@param repo string The GitHub repo ("username/repo"). ----@return Result # Result<GitHubRelease[]> -function M.fetch_releases(repo) - log.fmt_trace("Fetching GitHub releases for repo=%s", repo) - local path = ("repos/%s/releases"):format(repo) - return gh_api_call(path):map_err(function() - return ("Failed to fetch releases for GitHub repository %s."):format(repo) - end) -end - ----@async ----@param repo string The GitHub repo ("username/repo"). ----@param tag_name string The tag_name of the release to fetch. -function M.fetch_release(repo, tag_name) - log.fmt_trace("Fetching GitHub release for repo=%s, tag_name=%s", repo, tag_name) - local path = ("repos/%s/releases/tags/%s"):format(repo, tag_name) - return gh_api_call(path):map_err(function() - return ("Failed to fetch release %q for GitHub repository %s."):format(tag_name, repo) - end) -end - ----@async ----@param repo string The GitHub repo ("username/repo"). ---@return Result # Result<GitHubRelease> function M.fetch_latest_release(repo) - return providers.github.get_latest_release(repo) + local path = ("repos/%s/releases/latest"):format(repo) + return gh_api_call(path) end ---@async ---@param repo string The GitHub repo ("username/repo"). ----@return Result # Result<GitHubTag[]> -function M.fetch_tags(repo) - local path = ("repos/%s/tags"):format(repo) - return gh_api_call(path):map_err(function() - return ("Failed to fetch tags for GitHub repository %s."):format(repo) - end) +---@return Result # Result<GitHubRelease[]> +function M.fetch_all_releases(repo) + local path = ("repos/%s/releases"):format(repo) + return gh_api_call(path) end ---@async ---@param repo string The GitHub repo ("username/repo"). ----@return Result # Result<string> The latest tag name. -function M.fetch_latest_tag(repo) - return providers.github.get_latest_tag(repo):map(_.prop "tag") +---@return Result # Result<GitHubRef[]> +function M.fetch_all_tags(repo) + local path = ("repos/%s/git/matching-refs/tags"):format(repo) + return gh_api_call(path) end ---@async diff --git a/lua/mason-core/managers/github/init.lua b/lua/mason-core/managers/github/init.lua index 8e767d44..2d593790 100644 --- a/lua/mason-core/managers/github/init.lua +++ b/lua/mason-core/managers/github/init.lua @@ -1,8 +1,8 @@ local Result = require "mason-core.result" local _ = require "mason-core.functional" -local client = require "mason-core.managers.github.client" local installer = require "mason-core.installer" local platform = require "mason-core.platform" +local providers = require "mason-core.providers" local settings = require "mason.settings" local std = require "mason-core.managers.std" @@ -53,8 +53,8 @@ function M.release_version(opts) local ctx = installer.context() ---@type string local release = _.coalesce(opts.version, ctx.requested_version):or_else_get(function() - return client - .fetch_latest_release(opts.repo) + return providers.github + .get_latest_release(opts.repo) :map(_.prop "tag_name") :get_or_throw "Failed to fetch latest release from GitHub API. Refer to :h mason-provider-errors for more information." end) @@ -105,7 +105,10 @@ end function M.tag(opts) local ctx = installer.context() local tag = _.coalesce(opts.version, ctx.requested_version):or_else_get(function() - return client.fetch_latest_tag(opts.repo):get_or_throw "Failed to fetch latest tag from GitHub API." + return providers.github + .get_latest_tag(opts.repo) + :map(_.prop "tag") + :get_or_throw "Failed to fetch latest tag from GitHub API." end) return { @@ -168,7 +171,7 @@ function M.check_outdated_primary_package_release(receipt) if source.type ~= "github_release" and source.type ~= "github_release_file" then return Result.failure "Receipt does not have a primary source of type (github_release|github_release_file)." end - return client.fetch_latest_release(source.repo):map_catching( + return providers.github.get_latest_release(source.repo):map_catching( ---@param latest_release GitHubRelease function(latest_release) if source.release ~= latest_release.tag_name then @@ -190,7 +193,7 @@ function M.check_outdated_primary_package_tag(receipt) if source.type ~= "github_tag" then return Result.failure "Receipt does not have a primary source of type github_tag." end - return client.fetch_latest_tag(source.repo):map_catching(function(latest_tag) + return providers.github.get_latest_tag(source.repo):map(_.prop "tag"):map_catching(function(latest_tag) if source.tag ~= latest_tag then return { name = source.repo, diff --git a/lua/mason-registry/index/vls/init.lua b/lua/mason-registry/index/vls/init.lua index b1eaf6b6..33bc20f7 100644 --- a/lua/mason-registry/index/vls/init.lua +++ b/lua/mason-registry/index/vls/init.lua @@ -2,7 +2,6 @@ local Optional = require "mason-core.optional" local Pkg = require "mason-core.package" local _ = require "mason-core.functional" local github = require "mason-core.managers.github" -local github_client = require "mason-core.managers.github.client" local platform = require "mason-core.platform" local std = require "mason-core.managers.std" diff --git a/lua/mason/providers/client/gh.lua b/lua/mason/providers/client/gh.lua index 02c9a87b..25c59d74 100644 --- a/lua/mason/providers/client/gh.lua +++ b/lua/mason/providers/client/gh.lua @@ -1,30 +1,19 @@ local Result = require "mason-core.result" local _ = require "mason-core.functional" -local spawn = require "mason-core.spawn" +local client = require "mason-core.managers.github.client" ---@type GitHubProvider return { get_latest_release = function(repo) - return spawn - .gh({ "api", ("repos/%s/releases/latest"):format(repo) }) - :map(_.prop "stdout") - :map_catching(vim.json.decode) + return client.fetch_latest_release(repo) end, get_all_release_versions = function(repo) - return spawn - .gh({ "api", ("repos/%s/releases"):format(repo) }) - :map(_.prop "stdout") - :map_catching(vim.json.decode) - :map(_.map(_.prop "tag_name")) + return client.fetch_all_releases(repo):map(_.map(_.prop "tag_name")) end, get_latest_tag = function(repo) return Result.failure "Unimplemented" end, get_all_tags = function(repo) - return spawn - .gh({ "api", ("repos/%s/git/matching-refs/tags"):format(repo) }) - :map(_.prop "stdout") - :map_catching(vim.json.decode) - :map(_.map(_.compose(_.gsub("^refs/tags/", ""), _.prop "ref"))) + return client.fetch_all_tags(repo):map(_.map(_.compose(_.gsub("^refs/tags/", ""), _.prop "ref"))) end, } diff --git a/tests/mason-core/managers/github_spec.lua b/tests/mason-core/managers/github_spec.lua index b4ef3c42..d0a88faa 100644 --- a/tests/mason-core/managers/github_spec.lua +++ b/tests/mason-core/managers/github_spec.lua @@ -3,15 +3,15 @@ local stub = require "luassert.stub" local Optional = require "mason-core.optional" local Result = require "mason-core.result" -local client = require "mason-core.managers.github.client" local github = require "mason-core.managers.github" local installer = require "mason-core.installer" +local providers = require "mason-core.providers" describe("github release file", function() it( "should use provided version", async_test(function() - stub(client, "fetch_latest_release") + stub(providers.github, "get_latest_release") local handle = InstallHandleGenerator "dummy" local ctx = InstallContextGenerator(handle) installer.prepare_installer(ctx) @@ -22,7 +22,7 @@ describe("github release file", function() version = Optional.of "13.37", } end) - assert.spy(client.fetch_latest_release).was_not_called() + assert.spy(providers.github.get_latest_release).was_not_called() assert.equals("13.37", source.release) assert.equals( "https://github.com/williamboman/mason.nvim/releases/download/13.37/program.exe", @@ -34,8 +34,8 @@ describe("github release file", function() it( "should use use dynamic asset_file", async_test(function() - stub(client, "fetch_latest_release") - client.fetch_latest_release.returns(Result.success(mock.new { + stub(providers.github, "get_latest_release") + providers.github.get_latest_release.returns(Result.success(mock.new { tag_name = "im_the_tag", })) local handle = InstallHandleGenerator "dummy" @@ -49,8 +49,8 @@ describe("github release file", function() end, } end) - assert.spy(client.fetch_latest_release).was_called(1) - assert.spy(client.fetch_latest_release).was_called_with "williamboman/mason.nvim" + assert.spy(providers.github.get_latest_release).was_called(1) + assert.spy(providers.github.get_latest_release).was_called_with "williamboman/mason.nvim" assert.equals("im_the_tag", source.release) assert.equals("im_the_tag_for_reals", source.asset_file) assert.equals( @@ -65,7 +65,7 @@ describe("github release version", function() it( "should use provided version", async_test(function() - stub(client, "fetch_latest_release") + stub(providers.github, "get_latest_release") local handle = InstallHandleGenerator "dummy" local ctx = InstallContextGenerator(handle) installer.prepare_installer(ctx) @@ -75,7 +75,7 @@ describe("github release version", function() version = Optional.of "13.37", } end) - assert.spy(client.fetch_latest_release).was_not_called() + assert.spy(providers.github.get_latest_release).was_not_called() assert.equals("13.37", source.release) end) ) @@ -84,8 +84,8 @@ describe("github release version", function() "should fetch latest release from GitHub API", async_test(function() async_test(function() - stub(client, "fetch_latest_release") - client.fetch_latest_release.returns(Result.success { tag_name = "v42" }) + stub(providers.github, "get_latest_release") + providers.github.get_latest_release.returns(Result.success { tag_name = "v42" }) local handle = InstallHandleGenerator "dummy" local ctx = InstallContextGenerator(handle) installer.prepare_installer(ctx) @@ -94,8 +94,8 @@ describe("github release version", function() repo = "williamboman/mason.nvim", } end) - assert.spy(client.fetch_latest_release).was_called(1) - assert.spy(client.fetch_latest_release).was_called_with "williamboman/mason.nvim" + assert.spy(providers.github.get_latest_release).was_called(1) + assert.spy(providers.github.get_latest_release).was_called_with "williamboman/mason.nvim" assert.equals("v42", source.release) end) end) |
