From efb200e825d87a637642a516796e986db7b203fb Mon Sep 17 00:00:00 2001 From: "L. E. Segovia" <13498015+amyspark@users.noreply.github.com> Date: Thu, 22 Aug 2019 12:38:28 +0000 Subject: [PATCH] breadth-first search for dependents upgrade Fixes Homebrew/brew#6386 --- Library/Homebrew/cmd/upgrade.rb | 53 ++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/Library/Homebrew/cmd/upgrade.rb b/Library/Homebrew/cmd/upgrade.rb index ae432c7b57..314e91e4e5 100644 --- a/Library/Homebrew/cmd/upgrade.rb +++ b/Library/Homebrew/cmd/upgrade.rb @@ -213,37 +213,42 @@ module Homebrew formulae_to_upgrade = Set.new formulae_pinned = Set.new - formulae.each do |formula| + formulae_to_check = formulae + checked_formulae = Set.new + + until formulae_to_check.empty? descendants = Set.new - dependents = kegs.select do |keg| - keg.runtime_dependencies - .any? { |d| d["full_name"] == formula.full_name } - end + formulae_to_check.each do |formula| + next if checked_formulae.include?(formula) - next if dependents.empty? - - dependent_formulae = dependents.map(&:to_formula) - - dependent_formulae.each do |f| - next if formulae_to_upgrade.include?(f) - next if formulae_pinned.include?(f) - - if f.outdated?(fetch_head: args.fetch_HEAD?) - if f.pinned? - formulae_pinned << f - else - formulae_to_upgrade << f - end + dependents = kegs.select do |keg| + keg.runtime_dependencies + .any? { |d| d["full_name"] == formula.full_name } end - descendants << f + next if dependents.empty? + + dependent_formulae = dependents.map(&:to_formula) + + dependent_formulae.each do |f| + next if formulae_to_upgrade.include?(f) + next if formulae_pinned.include?(f) + if f.outdated?(fetch_head: args.fetch_HEAD?) + if f.pinned? + formulae_pinned << f + else + formulae_to_upgrade << f + end + end + + descendants << f + end + + checked_formulae << formula end - upgradable_descendants, pinned_descendants = upgradable_dependents(kegs, descendants) - - formulae_to_upgrade.merge upgradable_descendants - formulae_pinned.merge pinned_descendants + formulae_to_check = descendants end [formulae_to_upgrade, formulae_pinned]