aboutsummaryrefslogtreecommitdiffstats
path: root/lua/mason-core/installer
diff options
context:
space:
mode:
authorWilliam Boman <william@redwill.se>2023-09-11 00:37:05 +0200
committerWilliam Boman <william@redwill.se>2025-02-16 09:48:59 +0100
commitd0119c18adff184c5c75f7ec59b6f12b301d268d (patch)
tree3f196ef7cdde464392c0680edcd57fc6fe47825a /lua/mason-core/installer
parentrefactor!: remove old managers (#1497) (diff)
downloadmason-d0119c18adff184c5c75f7ec59b6f12b301d268d.tar
mason-d0119c18adff184c5c75f7ec59b6f12b301d268d.tar.gz
mason-d0119c18adff184c5c75f7ec59b6f12b301d268d.tar.bz2
mason-d0119c18adff184c5c75f7ec59b6f12b301d268d.tar.lz
mason-d0119c18adff184c5c75f7ec59b6f12b301d268d.tar.xz
mason-d0119c18adff184c5c75f7ec59b6f12b301d268d.tar.zst
mason-d0119c18adff184c5c75f7ec59b6f12b301d268d.zip
refactor!: consolidate Lua registry sources and the Package API (#1498)
**This removes the following APIs:** - `Package:check_new_version()`. Instead use the new `Package:get_latest_version()`. **This has a breaking change in the following APIs:** - `Package:get_installed_version()` now no longer takes a callback but instead returns the installed version or `nil` if not installed. <details> <summary>To handle these breaking changes in plugins, leverage the `mason.version` module, for example:</summary> ```lua local mason_version = require("mason.version") local registry = require("mason-registry") local pkg = registry.get_package("rust-analyzer") if mason_version.MAJOR_VERSION < 2 then -- before pkg:check_new_version(function (success, new_version) -- … end) pkg:get_installed_version(function (success, installed_version) -- … end) else -- after local new_version = pkg:get_latest_version() local installed_version = pkg:get_installed_version() fi ``` </details> --- <details> <summary>This change also introduces breaking changes for Lua registry sources, by consolidating the package schema with the registry.</summary> The following is an example of a package defined in a Lua registry, following the new schema: ```lua local Pkg = require("mason-core.package") return Pkg.new { schema = "registry+v1", name = "ripgrep", description = "ripgrep recursively searches directories for a regex pattern while respecting your gitignore.", homepage = "https://github.com/BurntSushi/ripgrep", licenses = { Pkg.License.MIT }, languages = {}, categories = {}, source = { id = "pkg:mason/ripgrep@13.0.0", ---@param ctx InstallContext ---@param purl Purl install = function(ctx, purl) -- Arbitrary installation code. end, }, bin = { rg = "./bin/rg", }, } ``` </details>
Diffstat (limited to 'lua/mason-core/installer')
-rw-r--r--lua/mason-core/installer/context.lua2
-rw-r--r--lua/mason-core/installer/init.lua8
-rw-r--r--lua/mason-core/installer/registry/init.lua17
-rw-r--r--lua/mason-core/installer/registry/providers/mason.lua43
4 files changed, 49 insertions, 21 deletions
diff --git a/lua/mason-core/installer/context.lua b/lua/mason-core/installer/context.lua
index 21c9c26f..a991cd9f 100644
--- a/lua/mason-core/installer/context.lua
+++ b/lua/mason-core/installer/context.lua
@@ -202,7 +202,7 @@ function InstallContext.new(handle, opts)
local cwd_manager = CwdManager.new(path.install_prefix())
return setmetatable({
cwd = cwd_manager,
- spawn = ContextualSpawn.new(cwd_manager, handle, not handle.package:is_registry_spec()),
+ spawn = ContextualSpawn.new(cwd_manager, handle, false),
handle = handle,
package = handle.package, -- for convenience
fs = ContextualFs.new(cwd_manager),
diff --git a/lua/mason-core/installer/init.lua b/lua/mason-core/installer/init.lua
index 994ab847..961c5c47 100644
--- a/lua/mason-core/installer/init.lua
+++ b/lua/mason-core/installer/init.lua
@@ -74,6 +74,7 @@ end
---@async
---@param context InstallContext
function M.prepare_installer(context)
+ local installer = require "mason-core.installer.registry"
return Result.try(function(try)
local package_build_prefix = path.package_build_prefix(context.package.name)
if fs.async.dir_exists(package_build_prefix) then
@@ -82,12 +83,7 @@ function M.prepare_installer(context)
try(Result.pcall(fs.async.mkdirp, package_build_prefix))
context.cwd:set(package_build_prefix)
- if context.package:is_registry_spec() then
- local registry_installer = require "mason-core.installer.registry"
- return try(registry_installer.compile(context.handle.package.spec, context.opts))
- else
- return context.package.spec.install
- end
+ return try(installer.compile(context.handle.package.spec, context.opts))
end)
end
diff --git a/lua/mason-core/installer/registry/init.lua b/lua/mason-core/installer/registry/init.lua
index e7c796e9..961e94ea 100644
--- a/lua/mason-core/installer/registry/init.lua
+++ b/lua/mason-core/installer/registry/init.lua
@@ -35,9 +35,10 @@ M.register_provider("nuget", _.lazy_require "mason-core.installer.registry.provi
M.register_provider("opam", _.lazy_require "mason-core.installer.registry.providers.opam")
M.register_provider("openvsx", _.lazy_require "mason-core.installer.registry.providers.openvsx")
M.register_provider("pypi", _.lazy_require "mason-core.installer.registry.providers.pypi")
+M.register_provider("mason", _.lazy_require "mason-core.installer.registry.providers.mason")
---@param purl Purl
-local function get_provider(purl)
+function M.get_provider(purl)
return Optional.of_nilable(PROVIDERS[purl.type]):ok_or(("Unknown purl type: %s"):format(purl.type))
end
@@ -127,7 +128,7 @@ function M.parse(spec, opts)
end
---@type InstallerProvider
- local provider = try(get_provider(purl))
+ local provider = try(M.get_provider(purl))
log.trace("Found provider for purl.", source.id)
local parsed_source = try(provider.parse(source, purl, opts))
log.trace("Parsed source for purl.", source.id, parsed_source)
@@ -213,16 +214,4 @@ 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/mason.lua b/lua/mason-core/installer/registry/providers/mason.lua
new file mode 100644
index 00000000..3490ebaa
--- /dev/null
+++ b/lua/mason-core/installer/registry/providers/mason.lua
@@ -0,0 +1,43 @@
+local Result = require "mason-core.result"
+local _ = require "mason-core.functional"
+
+local M = {}
+
+---@param source RegistryPackageSource
+---@param purl Purl
+function M.parse(source, purl)
+ if type(source.install) ~= "function" and type((getmetatable(source.install) or {}).__call) ~= "function" then
+ return Result.failure "source.install is not a function."
+ end
+
+ ---@class ParsedMasonSource : ParsedPackageSource
+ local parsed_source = {
+ purl = purl,
+ ---@type async fun(ctx: InstallContext, purl: Purl)
+ install = source.install,
+ }
+
+ return Result.success(parsed_source)
+end
+
+---@async
+---@param ctx InstallContext
+---@param source ParsedMasonSource
+function M.install(ctx, source)
+ ctx.spawn.strict_mode = true
+ return Result.pcall(source.install, ctx, source.purl)
+ :on_success(function()
+ ctx.spawn.strict_mode = false
+ end)
+ :on_failure(function()
+ ctx.spawn.strict_mode = false
+ end)
+end
+
+---@async
+---@param purl Purl
+function M.get_versions(purl)
+ return Result.failure "Unimplemented."
+end
+
+return M