tap: fix performance regression in *_files_by_name

We essentially stopped caching these accidentally and they get
called every time we try to load a cask or formula from the API.
It gets really, really, really slow.

I ran `brew deps --casks --eval-all` before and after the changes.

I let it run for 3 minutes before killing it. No output had been
printed to the screen.

It finished printing all output (pages and pages of it) in less
than a minute.

---

This should match the caching behavior we had before the
recent changes in these two PRs.

- https://github.com/Homebrew/brew/pull/16777
- https://github.com/Homebrew/brew/pull/16775
This commit is contained in:
apainintheneck 2024-03-01 19:26:39 -08:00
parent 0a3549b7f2
commit 99d5200db3

View File

@ -1211,6 +1211,7 @@ class CoreTap < AbstractCoreTap
def formula_files_by_name def formula_files_by_name
return super if Homebrew::EnvConfig.no_install_from_api? return super if Homebrew::EnvConfig.no_install_from_api?
@formula_files_by_name ||= begin
tap_path = path.to_s tap_path = path.to_s
Homebrew::API::Formula.all_formulae.each_with_object({}) do |item, hash| Homebrew::API::Formula.all_formulae.each_with_object({}) do |item, hash|
name, formula_hash = item name, formula_hash = item
@ -1221,6 +1222,7 @@ class CoreTap < AbstractCoreTap
hash[name] = Pathname(new_path) if existing_path.nil? || existing_path.to_s.length < new_path.length hash[name] = Pathname(new_path) if existing_path.nil? || existing_path.to_s.length < new_path.length
end end
end end
end
sig { returns(T::Hash[String, T.untyped]) } sig { returns(T::Hash[String, T.untyped]) }
def to_api_hash def to_api_hash
@ -1279,7 +1281,7 @@ class CoreCaskTap < AbstractCoreTap
def cask_files_by_name def cask_files_by_name
return super if Homebrew::EnvConfig.no_install_from_api? return super if Homebrew::EnvConfig.no_install_from_api?
Homebrew::API::Cask.all_casks.each_with_object({}) do |item, hash| @cask_files_by_name ||= Homebrew::API::Cask.all_casks.each_with_object({}) do |item, hash|
name, cask_hash = item name, cask_hash = item
# If there's more than one item with the same path: use the longer one to prioritise more specific results. # If there's more than one item with the same path: use the longer one to prioritise more specific results.
existing_path = hash[name] existing_path = hash[name]