diff options
| author | William Boman <william@redwill.se> | 2023-04-22 19:20:52 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-04-22 19:20:52 +0200 |
| commit | 579d4bd178f4aae76a4f4dc2ea34bf5e8fa6231b (patch) | |
| tree | ec3b23ec8a00ba1922bda6c7cf80a0c9242e1978 /lua/mason-registry | |
| parent | chore: remove generate scripts and artifacts (#1246) (diff) | |
| download | mason-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.lua | 10 | ||||
| -rw-r--r-- | lua/mason-registry/sources/github.lua | 49 | ||||
| -rw-r--r-- | lua/mason-registry/sources/lua.lua | 9 |
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 |
