cmd/audit: improve performance of versioned formula names

There is a check for other versioned formula with the same name
in the file audit. This just memoizes all of the versioned
formulae in a tap during the first call and then uses that much
shorter list everytime it checks for things.
This commit is contained in:
apainintheneck 2023-09-14 21:25:52 -07:00
parent 184efd9eab
commit 7e05a9b574
2 changed files with 16 additions and 6 deletions

View File

@ -489,20 +489,19 @@ class Formula
name.include?("@") name.include?("@")
end end
# Returns any `@`-versioned formulae names for any formula (including versioned formulae). # Returns any other `@`-versioned formulae names for any formula (including versioned formulae).
sig { returns(T::Array[String]) } sig { returns(T::Array[String]) }
def versioned_formulae_names def versioned_formulae_names
versioned_names = if tap versioned_names = if tap
name_prefix = "#{name.gsub(/(@[\d.]+)?$/, "")}@" name_prefix = name.gsub(/(@[\d.]+)?$/, "")
T.must(tap).formula_names.select do |name| T.must(tap).prefix_to_versioned_formulae_names.fetch(name_prefix, [])
name.start_with?(name_prefix)
end
elsif path.exist? elsif path.exist?
Pathname.glob(path.to_s.gsub(/(@[\d.]+)?\.rb$/, "@*.rb")) Pathname.glob(path.to_s.gsub(/(@[\d.]+)?\.rb$/, "@*.rb"))
.map { |path| path.basename(".rb").to_s } .map { |path| path.basename(".rb").to_s }
.sort
else else
raise "Either tap or path is required to list versioned formulae" raise "Either tap or path is required to list versioned formulae"
end.sort end
versioned_names.reject do |versioned_name| versioned_names.reject do |versioned_name|
versioned_name == name versioned_name == name

View File

@ -644,6 +644,17 @@ class Tap
@formula_names ||= formula_files.map(&method(:formula_file_to_name)) @formula_names ||= formula_files.map(&method(:formula_file_to_name))
end end
# A hash of all {Formula} name prefixes to versioned {Formula} in this {Tap}.
# @private
sig { returns(T::Hash[String, T::Array[String]]) }
def prefix_to_versioned_formulae_names
@prefix_to_versioned_formulae_names ||= formula_names
.select { |name| name.include?("@") }
.group_by { |name| name.gsub(/(@[\d.]+)?$/, "") }
.transform_values(&:sort)
.freeze
end
# An array of all {Cask} tokens of this {Tap}. # An array of all {Cask} tokens of this {Tap}.
sig { returns(T::Array[String]) } sig { returns(T::Array[String]) }
def cask_tokens def cask_tokens