Tidy up layout

This commit is contained in:
Douglas Eichelberger 2024-12-03 17:53:00 -08:00
parent e1fdd2eda4
commit 90d066c7b8
2 changed files with 146 additions and 151 deletions

View File

@ -1,7 +1,6 @@
# typed: strict # typed: strict
# frozen_string_literal: true # frozen_string_literal: true
require "delegate"
require "cli/args" require "cli/args"
module Homebrew module Homebrew
@ -12,6 +11,9 @@ module Homebrew
Elem = type_member(:out) { { fixed: String } } Elem = type_member(:out) { { fixed: String } }
sig { returns(Args) }
attr_reader :parent
sig { sig {
params( params(
args: String, args: String,
@ -32,20 +34,16 @@ module Homebrew
cask_options: false, cask_options: false,
without_api: false without_api: false
) )
@args = args super(args)
@override_spec = override_spec @override_spec = override_spec
@force_bottle = force_bottle @force_bottle = force_bottle
@flags = flags @flags = flags
@cask_options = cask_options @cask_options = cask_options
@without_api = without_api @without_api = without_api
@parent = parent @parent = parent
super(@args)
end end
sig { returns(Args) }
attr_reader :parent
sig { returns(T::Array[Cask::Cask]) } sig { returns(T::Array[Cask::Cask]) }
def to_casks def to_casks
@to_casks ||= T.let( @to_casks ||= T.let(
@ -151,10 +149,10 @@ module Homebrew
def to_formulae_and_casks_and_unavailable(only: parent.only_formula_or_cask, method: nil) def to_formulae_and_casks_and_unavailable(only: parent.only_formula_or_cask, method: nil)
@to_formulae_casks_unknowns ||= T.let( @to_formulae_casks_unknowns ||= T.let(
{}, {},
T.nilable( T.nilable(T::Hash[
T::Hash[T.nilable(Symbol), T.nilable(Symbol),
T::Array[T.any(Formula, Keg, Cask::Cask, T::Array[Keg], FormulaOrCaskUnavailableError)]], T::Array[T.any(Formula, Keg, Cask::Cask, T::Array[Keg], FormulaOrCaskUnavailableError)]
), ]),
) )
@to_formulae_casks_unknowns[method] = downcased_unique_named.map do |name| @to_formulae_casks_unknowns[method] = downcased_unique_named.map do |name|
load_formula_or_cask(name, only:, method:) load_formula_or_cask(name, only:, method:)
@ -163,144 +161,6 @@ module Homebrew
end.uniq.freeze end.uniq.freeze
end end
sig {
params(name: String, only: T.nilable(Symbol), method: T.nilable(Symbol), warn: T.nilable(T::Boolean))
.returns(T.any(Formula, Keg, Cask::Cask, T::Array[Keg]))
}
def load_formula_or_cask(name, only: nil, method: nil, warn: nil)
Homebrew.with_no_api_env_if_needed(@without_api) do
unreadable_error = nil
formula_or_kegs = if only != :cask
begin
case method
when nil, :factory
options = { warn:, force_bottle: @force_bottle, flags: @flags }.compact
Formulary.factory(name, *@override_spec, **options)
when :resolve
resolve_formula(name)
when :latest_kegs
resolve_latest_keg(name)
when :default_kegs
resolve_default_keg(name)
when :kegs
_, kegs = resolve_kegs(name)
kegs
else
raise
end
rescue FormulaUnreadableError, FormulaClassUnavailableError,
TapFormulaUnreadableError, TapFormulaClassUnavailableError,
FormulaSpecificationError => e
# Need to rescue before `FormulaUnavailableError` (superclass of this)
# The formula was found, but there's a problem with its implementation
unreadable_error ||= e
nil
rescue NoSuchKegError, FormulaUnavailableError => e
raise e if only == :formula
nil
end
end
if only == :formula
return formula_or_kegs if formula_or_kegs
elsif formula_or_kegs && (!formula_or_kegs.is_a?(Formula) || formula_or_kegs.tap&.core_tap?)
warn_if_cask_conflicts(name, "formula")
return formula_or_kegs
else
want_keg_like_cask = [:latest_kegs, :default_kegs, :kegs].include?(method)
cask = begin
config = Cask::Config.from_args(@parent) if @cask_options
options = { warn: }.compact
candidate_cask = Cask::CaskLoader.load(name, config:, **options)
if unreadable_error.present?
onoe <<~EOS
Failed to load formula: #{name}
#{unreadable_error}
EOS
opoo "Treating #{name} as a cask."
end
# If we're trying to get a keg-like Cask, do our best to use the same cask
# file that was used for installation, if possible.
if want_keg_like_cask &&
(installed_caskfile = candidate_cask.installed_caskfile) &&
installed_caskfile.exist?
cask = Cask::CaskLoader.load_from_installed_caskfile(installed_caskfile)
requested_tap, requested_token = Tap.with_cask_token(name)
if requested_tap && requested_token
installed_cask_tap = cask.tab.tap
if installed_cask_tap && installed_cask_tap != requested_tap
raise Cask::TapCaskUnavailableError.new(requested_tap, requested_token)
end
end
cask
else
candidate_cask
end
rescue Cask::CaskUnreadableError, Cask::CaskInvalidError => e
# If we're trying to get a keg-like Cask, do our best to handle it
# not being readable and return something that can be used.
if want_keg_like_cask
cask_version = Cask::Cask.new(name, config:).installed_version
Cask::Cask.new(name, config:) do
version cask_version if cask_version
end
else
# Need to rescue before `CaskUnavailableError` (superclass of this)
# The cask was found, but there's a problem with its implementation
unreadable_error ||= e
nil
end
rescue Cask::CaskUnavailableError => e
raise e if only == :cask
nil
end
# Prioritise formulae unless it's a core tap cask (we already prioritised core tap formulae above)
if formula_or_kegs && !cask&.tap&.core_cask_tap?
if cask || unreadable_error
onoe <<~EOS if unreadable_error
Failed to load cask: #{name}
#{unreadable_error}
EOS
opoo package_conflicts_message(name, "formula", cask) unless Context.current.quiet?
end
return formula_or_kegs
elsif cask
if formula_or_kegs && !Context.current.quiet?
opoo package_conflicts_message(name, "cask", formula_or_kegs)
end
return cask
end
end
raise unreadable_error if unreadable_error.present?
user, repo, short_name = name.downcase.split("/", 3)
if repo.present? && short_name.present?
tap = Tap.fetch(T.must(user), repo)
raise TapFormulaOrCaskUnavailableError.new(tap, short_name)
end
raise NoSuchKegError, name if resolve_formula(name)
end
end
private :load_formula_or_cask
sig { params(name: String).returns(Formula) }
def resolve_formula(name)
Formulary.resolve(name, **{ spec: @override_spec, force_bottle: @force_bottle, flags: @flags }.compact)
end
private :resolve_formula
sig { params(uniq: T::Boolean).returns(T::Array[Formula]) } sig { params(uniq: T::Boolean).returns(T::Array[Formula]) }
def to_resolved_formulae(uniq: true) def to_resolved_formulae(uniq: true)
@to_resolved_formulae ||= T.let( @to_resolved_formulae ||= T.let(
@ -456,6 +316,142 @@ module Homebrew
end.uniq end.uniq
end end
sig {
params(name: String, only: T.nilable(Symbol), method: T.nilable(Symbol), warn: T.nilable(T::Boolean))
.returns(T.any(Formula, Keg, Cask::Cask, T::Array[Keg]))
}
def load_formula_or_cask(name, only: nil, method: nil, warn: nil)
Homebrew.with_no_api_env_if_needed(@without_api) do
unreadable_error = nil
formula_or_kegs = if only != :cask
begin
case method
when nil, :factory
options = { warn:, force_bottle: @force_bottle, flags: @flags }.compact
Formulary.factory(name, *@override_spec, **options)
when :resolve
resolve_formula(name)
when :latest_kegs
resolve_latest_keg(name)
when :default_kegs
resolve_default_keg(name)
when :kegs
_, kegs = resolve_kegs(name)
kegs
else
raise
end
rescue FormulaUnreadableError, FormulaClassUnavailableError,
TapFormulaUnreadableError, TapFormulaClassUnavailableError,
FormulaSpecificationError => e
# Need to rescue before `FormulaUnavailableError` (superclass of this)
# The formula was found, but there's a problem with its implementation
unreadable_error ||= e
nil
rescue NoSuchKegError, FormulaUnavailableError => e
raise e if only == :formula
nil
end
end
if only == :formula
return formula_or_kegs if formula_or_kegs
elsif formula_or_kegs && (!formula_or_kegs.is_a?(Formula) || formula_or_kegs.tap&.core_tap?)
warn_if_cask_conflicts(name, "formula")
return formula_or_kegs
else
want_keg_like_cask = [:latest_kegs, :default_kegs, :kegs].include?(method)
cask = begin
config = Cask::Config.from_args(@parent) if @cask_options
options = { warn: }.compact
candidate_cask = Cask::CaskLoader.load(name, config:, **options)
if unreadable_error.present?
onoe <<~EOS
Failed to load formula: #{name}
#{unreadable_error}
EOS
opoo "Treating #{name} as a cask."
end
# If we're trying to get a keg-like Cask, do our best to use the same cask
# file that was used for installation, if possible.
if want_keg_like_cask &&
(installed_caskfile = candidate_cask.installed_caskfile) &&
installed_caskfile.exist?
cask = Cask::CaskLoader.load_from_installed_caskfile(installed_caskfile)
requested_tap, requested_token = Tap.with_cask_token(name)
if requested_tap && requested_token
installed_cask_tap = cask.tab.tap
if installed_cask_tap && installed_cask_tap != requested_tap
raise Cask::TapCaskUnavailableError.new(requested_tap, requested_token)
end
end
cask
else
candidate_cask
end
rescue Cask::CaskUnreadableError, Cask::CaskInvalidError => e
# If we're trying to get a keg-like Cask, do our best to handle it
# not being readable and return something that can be used.
if want_keg_like_cask
cask_version = Cask::Cask.new(name, config:).installed_version
Cask::Cask.new(name, config:) do
version cask_version if cask_version
end
else
# Need to rescue before `CaskUnavailableError` (superclass of this)
# The cask was found, but there's a problem with its implementation
unreadable_error ||= e
nil
end
rescue Cask::CaskUnavailableError => e
raise e if only == :cask
nil
end
# Prioritise formulae unless it's a core tap cask (we already prioritised core tap formulae above)
if formula_or_kegs && !cask&.tap&.core_cask_tap?
if cask || unreadable_error
onoe <<~EOS if unreadable_error
Failed to load cask: #{name}
#{unreadable_error}
EOS
opoo package_conflicts_message(name, "formula", cask) unless Context.current.quiet?
end
return formula_or_kegs
elsif cask
if formula_or_kegs && !Context.current.quiet?
opoo package_conflicts_message(name, "cask", formula_or_kegs)
end
return cask
end
end
raise unreadable_error if unreadable_error.present?
user, repo, short_name = name.downcase.split("/", 3)
if repo.present? && short_name.present?
tap = Tap.fetch(T.must(user), repo)
raise TapFormulaOrCaskUnavailableError.new(tap, short_name)
end
raise NoSuchKegError, name if resolve_formula(name)
end
end
sig { params(name: String).returns(Formula) }
def resolve_formula(name)
Formulary.resolve(name, **{ spec: @override_spec, force_bottle: @force_bottle, flags: @flags }.compact)
end
sig { params(name: String).returns([Pathname, T::Array[Keg]]) } sig { params(name: String).returns([Pathname, T::Array[Keg]]) }
def resolve_kegs(name) def resolve_kegs(name)
raise UsageError if name.blank? raise UsageError if name.blank?

View File

@ -41,8 +41,7 @@ module Homebrew
testing_formulae = args.named.first&.split(",").to_a.map do |name| testing_formulae = args.named.first&.split(",").to_a.map do |name|
TestRunnerFormula.new(Formulary.factory(name), eval_all: args.eval_all?) TestRunnerFormula.new(Formulary.factory(name), eval_all: args.eval_all?)
end end.freeze
.freeze
deleted_formulae = args.named.second&.split(",").to_a.freeze deleted_formulae = args.named.second&.split(",").to_a.freeze
runner_matrix = GitHubRunnerMatrix.new(testing_formulae, deleted_formulae, runner_matrix = GitHubRunnerMatrix.new(testing_formulae, deleted_formulae,
all_supported: args.all_supported?, all_supported: args.all_supported?,