From 01e1f7d49e91b6f02037997ffb465b37d2426b80 Mon Sep 17 00:00:00 2001 From: Alyssa Ross Date: Fri, 30 Dec 2016 17:41:57 +0000 Subject: [PATCH 1/2] keg: fix fallback dependencies with multiple kegs Fixes #1524. --- Library/Homebrew/keg.rb | 8 +++++++- Library/Homebrew/test/keg_test.rb | 7 +++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/Library/Homebrew/keg.rb b/Library/Homebrew/keg.rb index 756b272885..43e2cbc4f6 100644 --- a/Library/Homebrew/keg.rb +++ b/Library/Homebrew/keg.rb @@ -105,7 +105,13 @@ class Keg # # This happens after the initial dependency check because it's sloooow. remaining_formulae = Formula.installed.select do |f| - f.installed_kegs.any? { |k| Tab.for_keg(k).runtime_dependencies.nil? } + installed_kegs = f.installed_kegs + + # All installed kegs are going to be removed anyway, + # so it doesn't matter what they depend on. + next false if (installed_kegs - kegs).empty? + + installed_kegs.any? { |k| Tab.for_keg(k).runtime_dependencies.nil? } end keg_names = kegs.map(&:name) diff --git a/Library/Homebrew/test/keg_test.rb b/Library/Homebrew/test/keg_test.rb index 4fe7c6a3cf..14cdc4304a 100644 --- a/Library/Homebrew/test/keg_test.rb +++ b/Library/Homebrew/test/keg_test.rb @@ -382,6 +382,13 @@ class InstalledDependantsTests < LinkTestCase assert_equal [[@keg], ["bar"]], Keg.find_some_installed_dependents([@keg]) end + def test_uninstalling_dependent_and_dependency + dependencies nil + Formula["bar"].class.depends_on "foo" + assert_empty @keg.installed_dependents + assert_nil Keg.find_some_installed_dependents([@keg, @dependent]) + end + def test_empty_dependencies_in_tab dependencies [] assert_empty @keg.installed_dependents From b0a38c06bfce65292dafd8e43e04d9630d236218 Mon Sep 17 00:00:00 2001 From: Alyssa Ross Date: Fri, 30 Dec 2016 22:16:18 +0000 Subject: [PATCH 2/2] docs: improve Keg.find_some_installed_dependencies See https://github.com/Homebrew/brew/pull/1752#discussion_r94257147 --- Library/Homebrew/keg.rb | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/Library/Homebrew/keg.rb b/Library/Homebrew/keg.rb index 43e2cbc4f6..bdb618ba2f 100644 --- a/Library/Homebrew/keg.rb +++ b/Library/Homebrew/keg.rb @@ -87,11 +87,23 @@ class Keg mime-info pixmaps sounds postgresql ].freeze - # Will return some kegs, and some dependencies, if they're present. + # Given an array of kegs, this method will try to find some other kegs + # that depend on them. + # + # If it does, it returns: + # - some kegs in the passed array that have installed dependents + # - some installed dependents of those kegs. + # + # If it doesn't, it returns nil. + # + # Note that nil will be returned if the only installed dependents + # in the passed kegs are other kegs in the array. + # # For efficiency, we don't bother trying to get complete data. def self.find_some_installed_dependents(kegs) # First, check in the tabs of installed Formulae. kegs.each do |keg| + # Don't include dependencies of kegs that were in the given array. dependents = keg.installed_dependents - kegs dependents.map! { |d| "#{d.name} #{d.version}" } return [keg], dependents if dependents.any? @@ -107,8 +119,7 @@ class Keg remaining_formulae = Formula.installed.select do |f| installed_kegs = f.installed_kegs - # All installed kegs are going to be removed anyway, - # so it doesn't matter what they depend on. + # Don't include dependencies of kegs that were in the given array. next false if (installed_kegs - kegs).empty? installed_kegs.any? { |k| Tab.for_keg(k).runtime_dependencies.nil? }