diff options
Diffstat (limited to 'lua')
14 files changed, 145 insertions, 26 deletions
diff --git a/lua/mason-core/installer/registry/init.lua b/lua/mason-core/installer/registry/init.lua index f5655572..27a7da2a 100644 --- a/lua/mason-core/installer/registry/init.lua +++ b/lua/mason-core/installer/registry/init.lua @@ -42,6 +42,7 @@ end ---@class InstallerProvider ---@field parse fun(source: RegistryPackageSource, purl: Purl, opts: PackageInstallOpts): Result ---@field install async fun(ctx: InstallContext, source: ParsedPackageSource, purl: Purl): Result +---@field get_versions async fun(purl: Purl, source: RegistryPackageSource): Result # Result<string[]> ---@class ParsedPackageSource @@ -204,4 +205,16 @@ function M.compile(spec, opts) end) end +---@async +---@param spec RegistryPackageSpec +function M.get_versions(spec) + return Result.try(function(try) + ---@type Purl + local purl = try(Purl.parse(spec.source.id)) + ---@type InstallerProvider + local provider = try(get_provider(purl)) + return provider.get_versions(purl, spec.source) + end) +end + return M diff --git a/lua/mason-core/installer/registry/providers/cargo.lua b/lua/mason-core/installer/registry/providers/cargo.lua index 4c609be6..464fba5b 100644 --- a/lua/mason-core/installer/registry/providers/cargo.lua +++ b/lua/mason-core/installer/registry/providers/cargo.lua @@ -1,5 +1,6 @@ local Result = require "mason-core.result" local _ = require "mason-core.functional" +local providers = require "mason-core.providers" local util = require "mason-core.installer.registry.util" local M = {} @@ -46,7 +47,6 @@ end ---@param source ParsedCargoSource function M.install(ctx, source) local cargo = require "mason-core.installer.managers.cargo" - local providers = require "mason-core.providers" return Result.try(function(try) try(util.ensure_valid_version(function() @@ -61,4 +61,10 @@ function M.install(ctx, source) end) end +---@async +---@param purl Purl +function M.get_versions(purl) + return providers.crates.get_all_versions(purl.name) +end + return M diff --git a/lua/mason-core/installer/registry/providers/composer.lua b/lua/mason-core/installer/registry/providers/composer.lua index 59c0ae61..7cc03ed8 100644 --- a/lua/mason-core/installer/registry/providers/composer.lua +++ b/lua/mason-core/installer/registry/providers/composer.lua @@ -1,4 +1,5 @@ local Result = require "mason-core.result" +local providers = require "mason-core.providers" local util = require "mason-core.installer.registry.util" local M = {} @@ -20,7 +21,6 @@ end ---@param source ParsedComposerSource function M.install(ctx, source) local composer = require "mason-core.installer.managers.composer" - local providers = require "mason-core.providers" return Result.try(function(try) try(util.ensure_valid_version(function() @@ -31,4 +31,10 @@ function M.install(ctx, source) end) end +---@async +---@param purl Purl +function M.get_versions(purl) + return providers.packagist.get_all_versions(("%s/%s"):format(purl.namespace, purl.name)) +end + return M diff --git a/lua/mason-core/installer/registry/providers/gem.lua b/lua/mason-core/installer/registry/providers/gem.lua index ac040b8d..100046d9 100644 --- a/lua/mason-core/installer/registry/providers/gem.lua +++ b/lua/mason-core/installer/registry/providers/gem.lua @@ -1,5 +1,6 @@ local Result = require "mason-core.result" local _ = require "mason-core.functional" +local providers = require "mason-core.providers" local util = require "mason-core.installer.registry.util" local M = {} @@ -28,10 +29,9 @@ end ---@async ---@param ctx InstallContext ----@param source GemSource +---@param source ParsedGemSource function M.install(ctx, source) local gem = require "mason-core.installer.managers.gem" - local providers = require "mason-core.providers" return Result.try(function(try) try(util.ensure_valid_version(function() @@ -44,4 +44,10 @@ function M.install(ctx, source) end) end +---@async +---@param purl Purl +function M.get_versions(purl) + return providers.rubygems.get_all_versions(purl.name) +end + return M diff --git a/lua/mason-core/installer/registry/providers/generic/init.lua b/lua/mason-core/installer/registry/providers/generic/init.lua index a511471e..1bf79e94 100644 --- a/lua/mason-core/installer/registry/providers/generic/init.lua +++ b/lua/mason-core/installer/registry/providers/generic/init.lua @@ -33,4 +33,10 @@ function M.install(ctx, source) end end +---@async +---@param purl Purl +function M.get_versions(purl) + return Result.failure "Unimplemented." +end + return M diff --git a/lua/mason-core/installer/registry/providers/github/init.lua b/lua/mason-core/installer/registry/providers/github/init.lua index 41dd893d..0d68f3a5 100644 --- a/lua/mason-core/installer/registry/providers/github/init.lua +++ b/lua/mason-core/installer/registry/providers/github/init.lua @@ -32,4 +32,18 @@ function M.install(ctx, source, purl) end end +---@async +---@param purl Purl +---@param source GitHubReleaseSource | GitHubBuildSource +function M.get_versions(purl, source) + if source.asset then + return require("mason-core.installer.registry.providers.github.release").get_versions(purl) + elseif source.build then + -- We can't yet reliably determine the true source (release, tag, commit, etc.) for "build" sources. + return Result.failure "Unimplemented." + else + return Result.failure "Unknown source type." + end +end + return M diff --git a/lua/mason-core/installer/registry/providers/github/release.lua b/lua/mason-core/installer/registry/providers/github/release.lua index 645e2b95..9d01ba32 100644 --- a/lua/mason-core/installer/registry/providers/github/release.lua +++ b/lua/mason-core/installer/registry/providers/github/release.lua @@ -2,6 +2,7 @@ local Result = require "mason-core.result" local _ = require "mason-core.functional" local a = require "mason-core.async" local expr = require "mason-core.installer.registry.expr" +local providers = require "mason-core.providers" local settings = require "mason.settings" local util = require "mason-core.installer.registry.util" @@ -113,4 +114,10 @@ function M.install(ctx, source) end) end +---@async +---@param purl Purl +function M.get_versions(purl) + return providers.github.get_all_release_versions(("%s/%s"):format(purl.namespace, purl.name)) +end + return M diff --git a/lua/mason-core/installer/registry/providers/golang.lua b/lua/mason-core/installer/registry/providers/golang.lua index 34d8d160..f8e68bab 100644 --- a/lua/mason-core/installer/registry/providers/golang.lua +++ b/lua/mason-core/installer/registry/providers/golang.lua @@ -1,5 +1,6 @@ local Result = require "mason-core.result" local _ = require "mason-core.functional" +local providers = require "mason-core.providers" local util = require "mason-core.installer.registry.util" local M = {} @@ -34,7 +35,6 @@ end ---@param source ParsedGolangSource function M.install(ctx, source) local golang = require "mason-core.installer.managers.golang" - local providers = require "mason-core.providers" return Result.try(function(try) try(util.ensure_valid_version(function() @@ -47,4 +47,10 @@ function M.install(ctx, source) end) end +---@async +---@param purl Purl +function M.get_versions(purl) + return providers.golang.get_all_versions(get_package_name(purl)) +end + return M diff --git a/lua/mason-core/installer/registry/providers/luarocks.lua b/lua/mason-core/installer/registry/providers/luarocks.lua index 78b0fc7f..356857c0 100644 --- a/lua/mason-core/installer/registry/providers/luarocks.lua +++ b/lua/mason-core/installer/registry/providers/luarocks.lua @@ -42,4 +42,10 @@ function M.install(ctx, source) }) end +---@async +---@param purl Purl +function M.get_versions(purl) + return Result.failure "Unimplemented." +end + return M diff --git a/lua/mason-core/installer/registry/providers/npm.lua b/lua/mason-core/installer/registry/providers/npm.lua index 4b14c084..85b204c8 100644 --- a/lua/mason-core/installer/registry/providers/npm.lua +++ b/lua/mason-core/installer/registry/providers/npm.lua @@ -1,5 +1,6 @@ local Result = require "mason-core.result" local _ = require "mason-core.functional" +local providers = require "mason-core.providers" local util = require "mason-core.installer.registry.util" ---@param purl Purl @@ -48,4 +49,10 @@ function M.install(ctx, source) end) end +---@async +---@param purl Purl +function M.get_versions(purl) + return providers.npm.get_all_versions(purl_to_npm(purl)) +end + return M diff --git a/lua/mason-core/installer/registry/providers/nuget.lua b/lua/mason-core/installer/registry/providers/nuget.lua index 55bc689d..370c7b95 100644 --- a/lua/mason-core/installer/registry/providers/nuget.lua +++ b/lua/mason-core/installer/registry/providers/nuget.lua @@ -22,4 +22,10 @@ function M.install(ctx, source) return nuget.install(source.package, source.version) end +---@async +---@param purl Purl +function M.get_versions(purl) + return Result.failure "Unimplemented." +end + return M diff --git a/lua/mason-core/installer/registry/providers/opam.lua b/lua/mason-core/installer/registry/providers/opam.lua index 78608e85..276686ae 100644 --- a/lua/mason-core/installer/registry/providers/opam.lua +++ b/lua/mason-core/installer/registry/providers/opam.lua @@ -22,4 +22,10 @@ function M.install(ctx, source) return opam.install(source.package, source.version) end +---@async +---@param purl Purl +function M.get_versions(purl) + return Result.failure "Unimplemented." +end + return M diff --git a/lua/mason-core/installer/registry/providers/pypi.lua b/lua/mason-core/installer/registry/providers/pypi.lua index de0fa6f0..6efb9730 100644 --- a/lua/mason-core/installer/registry/providers/pypi.lua +++ b/lua/mason-core/installer/registry/providers/pypi.lua @@ -1,5 +1,6 @@ local Result = require "mason-core.result" local _ = require "mason-core.functional" +local providers = require "mason-core.providers" local settings = require "mason.settings" local util = require "mason-core.installer.registry.util" @@ -38,7 +39,6 @@ end ---@param source ParsedPypiSource function M.install(ctx, source) local pypi = require "mason-core.installer.managers.pypi" - local providers = require "mason-core.providers" return Result.try(function(try) try(util.ensure_valid_version(function() @@ -57,4 +57,10 @@ function M.install(ctx, source) end) end +---@async +---@param purl Purl +function M.get_versions(purl) + return providers.pypi.get_all_versions(purl.name) +end + return M diff --git a/lua/mason/api/command.lua b/lua/mason/api/command.lua index 2521f52f..75c101a4 100644 --- a/lua/mason/api/command.lua +++ b/lua/mason/api/command.lua @@ -145,7 +145,45 @@ vim.api.nvim_create_user_command("MasonInstall", function(opts) end, { desc = "Install one or more packages.", nargs = "+", - complete = "custom,v:lua.mason_completion.available_package_completion", + ---@param arg_lead string + complete = function(arg_lead) + local registry = require "mason-registry" + + if _.matches("^.+@", arg_lead) then + local pkg_name, version = unpack(_.match("^(.+)@(.*)", arg_lead)) + local ok, pkg = pcall(registry.get_package, pkg_name) + if not ok then + return {} + end + if pkg:is_registry_spec() then + local a = require "mason-core.async" + local registry_installer = require "mason-core.installer.registry" + return a.run_blocking(function() + return a.wait_first { + function() + return registry_installer + .get_versions(pkg.spec --[[@as RegistryPackageSpec]]) + :map( + _.compose( + _.map(_.concat(arg_lead)), + _.map(_.strip_prefix(version)), + _.filter(_.starts_with(version)) + ) + ) + :get_or_else {} + end, + function() + a.sleep(4000) + return {} + end, + } + end) + end + end + + local all_pkg_names = registry.get_all_package_names() + return _.sort_by(_.identity, _.filter(_.starts_with(arg_lead), all_pkg_names)) + end, }) ---@param package_names string[] @@ -166,7 +204,11 @@ vim.api.nvim_create_user_command("MasonUninstall", function(opts) end, { desc = "Uninstall one or more packages.", nargs = "+", - complete = "custom,v:lua.mason_completion.installed_package_completion", + ---@param arg_lead string + complete = function(arg_lead) + local registry = require "mason-registry" + return _.sort_by(_.identity, _.filter(_.starts_with(arg_lead), registry.get_installed_package_names())) + end, }) local function MasonUninstallAll() @@ -222,24 +264,6 @@ vim.api.nvim_create_user_command("MasonLog", MasonLog, { desc = "Opens the mason.nvim log.", }) --- selene: allow(global_usage) -_G.mason_completion = { - available_package_completion = function() - local registry = require "mason-registry" - registry.refresh() - local package_names = registry.get_all_package_names() - table.sort(package_names) - return table.concat(package_names, "\n") - end, - installed_package_completion = function() - local registry = require "mason-registry" - registry.refresh() - local package_names = registry.get_installed_package_names() - table.sort(package_names) - return table.concat(package_names, "\n") - end, -} - return { Mason = Mason, MasonInstall = MasonInstall, |
