Fix usage of Tab#installed_(on_request|as_dependency)

These can return `true`, `false` or `nil` so adjust the signature to
note this and fix the call sites to ensure we don't accidentally pass
through `nil` values when we shouldn't.

While we're here, make a `TODO` to fix this bad API up in future.

Fixes https://github.com/Homebrew/brew/issues/19076
This commit is contained in:
Mike McQuaid 2025-01-13 09:24:42 +00:00
parent 6aac197d55
commit 0940fb78dc
No known key found for this signature in database
5 changed files with 15 additions and 7 deletions

View File

@ -41,12 +41,12 @@ module Homebrew
sig { params(formula: Formula).returns(T::Boolean) } sig { params(formula: Formula).returns(T::Boolean) }
def installed_on_request?(formula) def installed_on_request?(formula)
formula.any_installed_keg&.tab&.installed_on_request formula.any_installed_keg&.tab&.installed_on_request == true
end end
sig { params(formula: Formula).returns(T::Boolean) } sig { params(formula: Formula).returns(T::Boolean) }
def installed_as_dependency?(formula) def installed_as_dependency?(formula)
formula.any_installed_keg&.tab&.installed_as_dependency formula.any_installed_keg&.tab&.installed_as_dependency == true
end end
end end
end end

View File

@ -800,12 +800,18 @@ on_request: installed_on_request?, options:)
options |= inherited_options options |= inherited_options
options &= df.options options &= df.options
installed_on_request = if df.any_version_installed? && tab.present? && tab.installed_on_request
true
else
false
end
fi = FormulaInstaller.new( fi = FormulaInstaller.new(
df, df,
options:, options:,
link_keg: keg_had_linked_keg && keg_was_linked, link_keg: keg_had_linked_keg && keg_was_linked,
installed_as_dependency: true, installed_as_dependency: true,
installed_on_request: df.any_version_installed? && tab.present? && tab.installed_on_request, installed_on_request:,
force_bottle: false, force_bottle: false,
include_test_formulae: @include_test_formulae, include_test_formulae: @include_test_formulae,
build_from_source_formulae: @build_from_source_formulae, build_from_source_formulae: @build_from_source_formulae,

View File

@ -25,8 +25,8 @@ module Homebrew
keg = Keg.new(formula.opt_prefix.resolved_path) keg = Keg.new(formula.opt_prefix.resolved_path)
tab = keg.tab tab = keg.tab
link_keg = keg.linked? link_keg = keg.linked?
installed_as_dependency = tab.installed_as_dependency installed_as_dependency = tab.installed_as_dependency == true
installed_on_request = tab.installed_on_request installed_on_request = tab.installed_on_request == true
build_bottle = tab.built_bottle? build_bottle = tab.built_bottle?
backup keg backup keg
else else

View File

@ -16,11 +16,13 @@ class AbstractTab
# Check whether the formula or cask was installed as a dependency. # Check whether the formula or cask was installed as a dependency.
# #
# @api internal # @api internal
sig { returns(T.nilable(T::Boolean)) } # TODO: change this to always return a boolean
attr_accessor :installed_as_dependency attr_accessor :installed_as_dependency
# Check whether the formula or cask was installed on request. # Check whether the formula or cask was installed on request.
# #
# @api internal # @api internal
sig { returns(T.nilable(T::Boolean)) } # TODO: change this to always return a boolean
attr_accessor :installed_on_request attr_accessor :installed_on_request
attr_accessor :homebrew_version, :tabfile, :loaded_from_api, :time, :arch, :source, :built_on attr_accessor :homebrew_version, :tabfile, :loaded_from_api, :time, :arch, :source, :built_on

View File

@ -132,8 +132,8 @@ module Homebrew
if keg if keg
tab = keg.tab tab = keg.tab
link_keg = keg.linked? link_keg = keg.linked?
installed_as_dependency = tab.installed_as_dependency installed_as_dependency = tab.installed_as_dependency == true
installed_on_request = tab.installed_on_request installed_on_request = tab.installed_on_request == true
build_bottle = tab.built_bottle? build_bottle = tab.built_bottle?
else else
link_keg = nil link_keg = nil