From 579d4bd178f4aae76a4f4dc2ea34bf5e8fa6231b Mon Sep 17 00:00:00 2001 From: William Boman Date: Sat, 22 Apr 2023 19:20:52 +0200 Subject: 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. --- doc/mason.txt | 12 +++++++-- lua/mason-registry/init.lua | 10 +++++++ lua/mason-registry/sources/github.lua | 49 +++++++++++++++++++++------------- lua/mason-registry/sources/lua.lua | 9 +++++++ tests/mason-registry/registry_spec.lua | 4 +++ 5 files changed, 63 insertions(+), 21 deletions(-) diff --git a/doc/mason.txt b/doc/mason.txt index d29abaf4..c7fc564b 100644 --- a/doc/mason.txt +++ b/doc/mason.txt @@ -492,12 +492,20 @@ get_all_packages() *mason-registry.get_all_package_names()* get_all_package_names() - Returns all package names. This is a fast function that doesn't load any - extra modules. + Returns all package names. This is a faster function than + |mason-registry.get_all_packages()| because it loads fewer modules. Returns: string[] + *mason-registry.get_all_package_specs()* +get_all_package_specs() + Returns all package specifications. This is a faster function than + |mason-registry.get_all_packages()| because it loads fewer modules. + + Returns: + (PackageSpec | RegistryPackageSpec)[] + *mason-registry.update()* update({callback}) Updates all managed registries. 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 @@ -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 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() +