diff --git a/Library/Homebrew/formula_installer.rb b/Library/Homebrew/formula_installer.rb index ddcb7599f5..ff4eb700c9 100644 --- a/Library/Homebrew/formula_installer.rb +++ b/Library/Homebrew/formula_installer.rb @@ -31,6 +31,7 @@ class FormulaInstaller extend Predicable attr_reader :formula + attr_reader :bottle_tab_runtime_dependencies attr_accessor :options, :link_keg @@ -96,7 +97,7 @@ class FormulaInstaller @requirement_messages = [] @poured_bottle = false @start_time = nil - @bottle_tab_runtime_dependencies = {} + @bottle_tab_runtime_dependencies = {}.freeze # Take the original formula instance, which might have been swapped from an API instance to a source instance @formula = previously_fetched_formula if previously_fetched_formula diff --git a/Library/Homebrew/upgrade.rb b/Library/Homebrew/upgrade.rb index a6579e22bb..1f29b0c487 100644 --- a/Library/Homebrew/upgrade.rb +++ b/Library/Homebrew/upgrade.rb @@ -22,6 +22,7 @@ module Homebrew installed_on_request: false, force_bottle: false, build_from_source_formulae: [], + dependents: false, interactive: false, keep_tmp: false, debug_symbols: false, @@ -70,6 +71,20 @@ module Homebrew ) unless dry_run fi.prelude + + # Don't need to install this bottle if all the runtime dependencies + # are already satisfied. + next if dependents && fi.bottle_tab_runtime_dependencies.presence&.none? do |dependency, hash| + installed_version = begin + Formula[dependency].any_installed_version + rescue FormulaUnavailableError + nil + end + next true unless installed_version + + Version.new(hash["version"]) > installed_version.version + end + fi.fetch end fi @@ -336,6 +351,7 @@ module Homebrew installed_on_request: installed_on_request, force_bottle: force_bottle, build_from_source_formulae: build_from_source_formulae, + dependents: true, interactive: interactive, keep_tmp: keep_tmp, debug_symbols: debug_symbols,