aboutsummaryrefslogtreecommitdiffstats
path: root/lua
diff options
context:
space:
mode:
authorWilliam Boman <william@redwill.se>2023-06-13 15:58:05 +0200
committerGitHub <noreply@github.com>2023-06-13 15:58:05 +0200
commit13e26c81ff5074ee8f095a791cd37fc1cec37377 (patch)
tree3b2d62ecf6cf4abcf096be4f30c1bf5975ca95d9 /lua
parentfix(functional): strip_prefix and strip_suffix should not use patterns (#1352) (diff)
downloadmason-13e26c81ff5074ee8f095a791cd37fc1cec37377.tar
mason-13e26c81ff5074ee8f095a791cd37fc1cec37377.tar.gz
mason-13e26c81ff5074ee8f095a791cd37fc1cec37377.tar.bz2
mason-13e26c81ff5074ee8f095a791cd37fc1cec37377.tar.lz
mason-13e26c81ff5074ee8f095a791cd37fc1cec37377.tar.xz
mason-13e26c81ff5074ee8f095a791cd37fc1cec37377.tar.zst
mason-13e26c81ff5074ee8f095a791cd37fc1cec37377.zip
feat(command): improve completion for :MasonInstall (#1353)
Now also supports completing versions if completion is triggered when specifying a version, e.g. "rust-analyzer@".
Diffstat (limited to 'lua')
-rw-r--r--lua/mason-core/installer/registry/init.lua13
-rw-r--r--lua/mason-core/installer/registry/providers/cargo.lua8
-rw-r--r--lua/mason-core/installer/registry/providers/composer.lua8
-rw-r--r--lua/mason-core/installer/registry/providers/gem.lua10
-rw-r--r--lua/mason-core/installer/registry/providers/generic/init.lua6
-rw-r--r--lua/mason-core/installer/registry/providers/github/init.lua14
-rw-r--r--lua/mason-core/installer/registry/providers/github/release.lua7
-rw-r--r--lua/mason-core/installer/registry/providers/golang.lua8
-rw-r--r--lua/mason-core/installer/registry/providers/luarocks.lua6
-rw-r--r--lua/mason-core/installer/registry/providers/npm.lua7
-rw-r--r--lua/mason-core/installer/registry/providers/nuget.lua6
-rw-r--r--lua/mason-core/installer/registry/providers/opam.lua6
-rw-r--r--lua/mason-core/installer/registry/providers/pypi.lua8
-rw-r--r--lua/mason/api/command.lua64
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,