aboutsummaryrefslogtreecommitdiffstats
path: root/lua/mason-registry
diff options
context:
space:
mode:
authorWilliam Boman <william@redwill.se>2023-04-22 19:20:52 +0200
committerGitHub <noreply@github.com>2023-04-22 19:20:52 +0200
commit579d4bd178f4aae76a4f4dc2ea34bf5e8fa6231b (patch)
treeec3b23ec8a00ba1922bda6c7cf80a0c9242e1978 /lua/mason-registry
parentchore: remove generate scripts and artifacts (#1246) (diff)
downloadmason-579d4bd178f4aae76a4f4dc2ea34bf5e8fa6231b.tar
mason-579d4bd178f4aae76a4f4dc2ea34bf5e8fa6231b.tar.gz
mason-579d4bd178f4aae76a4f4dc2ea34bf5e8fa6231b.tar.bz2
mason-579d4bd178f4aae76a4f4dc2ea34bf5e8fa6231b.tar.lz
mason-579d4bd178f4aae76a4f4dc2ea34bf5e8fa6231b.tar.xz
mason-579d4bd178f4aae76a4f4dc2ea34bf5e8fa6231b.tar.zst
mason-579d4bd178f4aae76a4f4dc2ea34bf5e8fa6231b.zip
feat(registry): add .get_all_package_specs() (#1247)
This is a faster method than .get_all_packages() due to the fact that it only loads package specifications without instantiating mason-core.package instances. Useful for situations where one only needs to read spec data.
Diffstat (limited to 'lua/mason-registry')
-rw-r--r--lua/mason-registry/init.lua10
-rw-r--r--lua/mason-registry/sources/github.lua49
-rw-r--r--lua/mason-registry/sources/lua.lua9
3 files changed, 49 insertions, 19 deletions
diff --git a/lua/mason-registry/init.lua b/lua/mason-registry/init.lua
index e798ac92..a407ad4f 100644
--- a/lua/mason-registry/init.lua
+++ b/lua/mason-registry/init.lua
@@ -10,6 +10,7 @@ local sources = require "mason-registry.sources"
---@field id string
---@field get_package fun(self: RegistrySource, pkg_name: string): Package?
---@field get_all_package_names fun(self: RegistrySource): string[]
+---@field get_all_package_specs fun(self: RegistrySource): PackageSpec[] | RegistryPackageSpec[]
---@field get_display_name fun(self: RegistrySource): string
---@field is_installed fun(self: RegistrySource): boolean
---@field get_installer fun(self: RegistrySource): Optional # Optional<async fun (): Result>
@@ -119,6 +120,15 @@ function M.get_all_packages()
return get_packages(M.get_all_package_names())
end
+---@return (RegistryPackageSpec | PackageSpec)[]
+function M.get_all_package_specs()
+ local specs = {}
+ for source in sources.iter() do
+ vim.list_extend(specs, source:get_all_package_specs())
+ end
+ return _.uniq_by(_.prop "name", specs)
+end
+
local STATE_FILE = path.concat {
vim.fn.stdpath((vim.fn.has "nvim-0.8.0" == 1) and "state" or "cache"),
"mason-registry-update",
diff --git a/lua/mason-registry/sources/github.lua b/lua/mason-registry/sources/github.lua
index ec758144..2e9c5210 100644
--- a/lua/mason-registry/sources/github.lua
+++ b/lua/mason-registry/sources/github.lua
@@ -6,11 +6,9 @@ local fetch = require "mason-core.fetch"
local fs = require "mason-core.fs"
local log = require "mason-core.log"
local path = require "mason-core.path"
-local platform = require "mason-core.platform"
local providers = require "mason-core.providers"
local registry_installer = require "mason-core.installer.registry"
local settings = require "mason.settings"
-local spawn = require "mason-core.spawn"
-- Parse sha256sum text output to a table<filename: string, sha256sum: string> structure
local parse_checksums = _.compose(_.from_pairs, _.map(_.compose(_.reverse, _.split " ")), _.split "\n", _.trim)
@@ -48,43 +46,56 @@ function GitHubRegistrySource:is_installed()
return fs.sync.file_exists(self.data_file) and fs.sync.file_exists(self.info_file)
end
+---@return RegistryPackageSpec[]
+function GitHubRegistrySource:get_all_package_specs()
+ if not self:is_installed() then
+ return {}
+ end
+ local data = vim.json.decode(fs.sync.read_file(self.data_file)) --[[@as RegistryPackageSpec[] ]]
+ return _.filter_map(
+ ---@param spec RegistryPackageSpec
+ function(spec)
+ -- registry+v1 specifications doesn't include a schema property, so infer it
+ spec.schema = spec.schema or "registry+v1"
+
+ if not registry_installer.SCHEMA_CAP[spec.schema] then
+ log.fmt_debug("Excluding package=%s with unsupported schema_version=%s", spec.name, spec.schema)
+ return Optional.empty()
+ end
+
+ -- XXX: this is for compatibilty with the PackageSpec structure
+ spec.desc = spec.description
+ return Optional.of(spec)
+ end,
+ data
+ )
+end
+
function GitHubRegistrySource:reload()
if not self:is_installed() then
return
end
- local data = vim.json.decode(fs.sync.read_file(self.data_file))
self.buffer = _.compose(
_.index_by(_.prop "name"),
- _.filter_map(
+ _.map(
---@param spec RegistryPackageSpec
function(spec)
- -- registry+v1 specifications doesn't include a schema property, so infer it
- spec.schema = spec.schema or "registry+v1"
-
- if not registry_installer.SCHEMA_CAP[spec.schema] then
- log.fmt_debug("Excluding package=%s with unsupported schema_version=%s", spec.name, spec.schema)
- return Optional.empty()
- end
-
-- hydrate Pkg.Lang index
_.each(function(lang)
local _ = Pkg.Lang[lang]
end, spec.languages)
- -- XXX: this is for compatibilty with the PackageSpec structure
- spec.desc = spec.description
-
local pkg = self.buffer and self.buffer[spec.name]
if pkg then
-- Apply spec to the existing Package instance. This is important as to not have lingering package
-- instances.
pkg.spec = spec
- return Optional.of(pkg)
+ return pkg
end
- return Optional.of(Pkg.new(spec))
+ return Pkg.new(spec)
end
)
- )(data)
+ )(self:get_all_package_specs())
return self.buffer
end
@@ -99,7 +110,7 @@ function GitHubRegistrySource:get_package(pkg)
end
function GitHubRegistrySource:get_all_package_names()
- return _.keys(self:get_buffer())
+ return _.map(_.prop "name", self:get_all_package_specs())
end
function GitHubRegistrySource:get_installer()
diff --git a/lua/mason-registry/sources/lua.lua b/lua/mason-registry/sources/lua.lua
index c3e96075..1675f232 100644
--- a/lua/mason-registry/sources/lua.lua
+++ b/lua/mason-registry/sources/lua.lua
@@ -1,3 +1,5 @@
+local Optional = require "mason-core.optional"
+local _ = require "mason-core.functional"
local log = require "mason-core.log"
---@class LuaRegistrySourceSpec
@@ -37,6 +39,13 @@ function LuaRegistrySource:get_all_package_names()
return vim.tbl_keys(index)
end
+---@return PackageSpec[]
+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())
+end
+
function LuaRegistrySource:is_installed()
local ok = pcall(require, self.spec.mod)
return ok