diff options
Diffstat (limited to 'lua/mason-registry/sources/init.lua')
| -rw-r--r-- | lua/mason-registry/sources/init.lua | 52 |
1 files changed, 50 insertions, 2 deletions
diff --git a/lua/mason-registry/sources/init.lua b/lua/mason-registry/sources/init.lua index c08a46a5..765d4904 100644 --- a/lua/mason-registry/sources/init.lua +++ b/lua/mason-registry/sources/init.lua @@ -1,3 +1,5 @@ +local log = require "mason-core.log" + ---@class RegistrySource ---@field id string ---@field get_package fun(self: RegistrySource, pkg_name: string): Package? @@ -7,6 +9,7 @@ ---@field is_installed fun(self: RegistrySource): boolean ---@field install fun(self: RegistrySource): Result ---@field serialize fun(self: RegistrySource): InstallReceiptRegistry +---@field is_same_location fun(self: RegistrySource, other: RegistrySource): boolean ---@alias RegistrySourceType '"github"' | '"lua"' | '"file"' @@ -69,6 +72,18 @@ function LazySource:get() return self.instance end +---@param other LazySource +function LazySource:is_same_location(other) + if self.type == other.type then + return self:get():is_same_location(other:get()) + end + return false +end + +function LazySource:get_full_id() + return ("%s:%s"):format(self.type, self.id) +end + function LazySource:__tostring() return ("LazySource(type=%s, id=%s)"):format(self.type, self.id) end @@ -113,16 +128,40 @@ end ---@param registry string function LazySourceCollection:append(registry) - table.insert(self.list, parse(registry)) + self:unique_insert(parse(registry)) return self end ---@param registry string function LazySourceCollection:prepend(registry) - table.insert(self.list, 1, parse(registry)) + self:unique_insert(parse(registry), 1) return self end +---@param source LazySource +---@param idx? integer +function LazySourceCollection:unique_insert(source, idx) + idx = idx or #self.list + 1 + if idx > 1 then + for i = 1, math.min(idx, #self.list) do + if self.list[i]:is_same_location(source) then + log.fmt_warn( + "Ignoring duplicate registry entry %s (duplicate of %s)", + source:get_full_id(), + self.list[i]:get_full_id() + ) + return + end + end + end + for i = #self.list, idx, -1 do + if self.list[i]:is_same_location(source) then + table.remove(self.list, i) + end + end + table.insert(self.list, idx, source) +end + function LazySourceCollection:is_all_installed() for source in self:iterate { include_uninstalled = true } do if not source:is_installed() then @@ -171,6 +210,15 @@ function LazySourceCollection:to_list(opts) return list end +---@param idx integer +function LazySourceCollection:get(idx) + return self.list[idx] +end + +function LazySourceCollection:size() + return #self.list +end + function LazySourceCollection:__tostring() return ("LazySourceCollection(list={%s})"):format(table.concat(vim.tbl_map(tostring, self.list), ", ")) end |
