aboutsummaryrefslogtreecommitdiffstats
path: root/lua
diff options
context:
space:
mode:
authorWilliam Boman <william@redwill.se>2025-05-02 03:52:10 +0200
committerWilliam Boman <william@redwill.se>2025-05-02 03:57:07 +0200
commit4da89f3ab04783da990f9bd40aaa36c22e59375b (patch)
treebb672a1bd796a6adf3d04473cb66a3e90be00707 /lua
parentfeat(ui): display purl information (diff)
downloadmason-4da89f3ab04783da990f9bd40aaa36c22e59375b.tar
mason-4da89f3ab04783da990f9bd40aaa36c22e59375b.tar.gz
mason-4da89f3ab04783da990f9bd40aaa36c22e59375b.tar.bz2
mason-4da89f3ab04783da990f9bd40aaa36c22e59375b.tar.lz
mason-4da89f3ab04783da990f9bd40aaa36c22e59375b.tar.xz
mason-4da89f3ab04783da990f9bd40aaa36c22e59375b.tar.zst
mason-4da89f3ab04783da990f9bd40aaa36c22e59375b.zip
refactor(registry): change lua registries to not instantiate Package themselves
Instead of having Lua registries instantiate package instances themselves we now do it in the installer of Lua registry sources. This aligns the behaviour of the Lua registry protocol with the other registry protocols.
Diffstat (limited to 'lua')
-rw-r--r--lua/mason-registry/init.lua2
-rw-r--r--lua/mason-registry/sources/file.lua4
-rw-r--r--lua/mason-registry/sources/lua.lua53
3 files changed, 36 insertions, 23 deletions
diff --git a/lua/mason-registry/init.lua b/lua/mason-registry/init.lua
index b129380c..713335f0 100644
--- a/lua/mason-registry/init.lua
+++ b/lua/mason-registry/init.lua
@@ -119,9 +119,11 @@ function Registry.update(callback)
Registry:emit("update:progress", finished, all)
end)
:on_success(function(updated_registries)
+ log.fmt_debug("Successfully updated %d registries.", #updated_registries)
Registry:emit("update:success", updated_registries)
end)
:on_failure(function(errors)
+ log.error("Failed to update registries.", errors)
Registry:emit("update:failed", errors)
end)
:get_or_throw()
diff --git a/lua/mason-registry/sources/file.lua b/lua/mason-registry/sources/file.lua
index 84566479..d81fcc9c 100644
--- a/lua/mason-registry/sources/file.lua
+++ b/lua/mason-registry/sources/file.lua
@@ -1,8 +1,6 @@
-local Optional = require "mason-core.optional"
local Result = require "mason-core.result"
local _ = require "mason-core.functional"
local a = require "mason-core.async"
-local async_control = require "mason-core.async.control"
local async_uv = require "mason-core.async.uv"
local fs = require "mason-core.fs"
local log = require "mason-core.log"
@@ -11,8 +9,6 @@ local process = require "mason-core.process"
local spawn = require "mason-core.spawn"
local util = require "mason-registry.sources.util"
-local Channel = async_control.Channel
-
---@class FileRegistrySourceSpec
---@field id string
---@field path string
diff --git a/lua/mason-registry/sources/lua.lua b/lua/mason-registry/sources/lua.lua
index 7fae54fe..e2144a83 100644
--- a/lua/mason-registry/sources/lua.lua
+++ b/lua/mason-registry/sources/lua.lua
@@ -1,7 +1,6 @@
-local Optional = require "mason-core.optional"
local Result = require "mason-core.result"
local _ = require "mason-core.functional"
-local log = require "mason-core.log"
+local util = require "mason-registry.sources.util"
---@class LuaRegistrySourceSpec
---@field id string
@@ -9,6 +8,7 @@ local log = require "mason-core.log"
---@class LuaRegistrySource : RegistrySource
---@field private spec LuaRegistrySourceSpec
+---@field buffer { specs: RegistryPackageSpec[], instances: table<string, Package> }?
local LuaRegistrySource = {}
LuaRegistrySource.__index = LuaRegistrySource
@@ -25,37 +25,52 @@ end
---@param pkg_name string
---@return Package?
function LuaRegistrySource:get_package(pkg_name)
- local index = require(self.spec.mod)
- if index[pkg_name] then
- local ok, mod = pcall(require, index[pkg_name])
- if ok then
- return mod
- else
- log.fmt_warn("Unable to load %s from %s: %s", pkg_name, self, mod)
- end
- end
+ return self:get_buffer().instances[pkg_name]
+end
+
+---@param specs RegistryPackageSpec[]
+function LuaRegistrySource:reload(specs)
+ self.buffer = _.assoc("specs", specs, self.buffer or {})
+ self.buffer.instances = _.compose(
+ _.index_by(_.prop "name"),
+ _.map(util.hydrate_package(self.buffer.instances or {}))
+ )(self:get_all_package_specs())
+ return self.buffer
end
function LuaRegistrySource:install()
- return Result.pcall(require, self.spec.mod)
+ return Result.try(function(try)
+ local index = try(Result.pcall(require, self.spec.mod))
+ ---@type RegistryPackageSpec[]
+ local specs = {}
+
+ for _, mod in pairs(index) do
+ table.insert(specs, try(Result.pcall(require, mod)))
+ end
+
+ try(Result.pcall(self.reload, self, specs))
+ end)
end
---@return string[]
function LuaRegistrySource:get_all_package_names()
- local index = require(self.spec.mod)
- return vim.tbl_keys(index)
+ return _.map(_.prop "name", self:get_all_package_specs())
end
---@return RegistryPackageSpec[]
function LuaRegistrySource:get_all_package_specs()
- return _.filter_map(function(name)
- return Optional.of_nilable(self:get_package(name)):map(_.prop "spec")
- end, self:get_all_package_names())
+ return _.filter_map(util.map_registry_spec, self:get_buffer().specs)
+end
+
+function LuaRegistrySource:get_buffer()
+ return self.buffer or {
+ specs = {},
+ instances = {},
+ }
end
function LuaRegistrySource:is_installed()
- local ok = pcall(require, self.spec.mod)
- return ok
+ return self.buffer ~= nil
end
function LuaRegistrySource:get_display_name()