From 05b85a7bef112a2d3db7cd56c819a62d9bb34e1b Mon Sep 17 00:00:00 2001 From: Alyssa Ross Date: Thu, 17 Nov 2016 16:18:50 +0000 Subject: [PATCH 1/4] keg: update installed dependency resolution Closes #1525. (See there for a motivation for this change.) --- Library/Homebrew/keg.rb | 7 +++---- Library/Homebrew/test/keg_test.rb | 12 ++++++++++-- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/Library/Homebrew/keg.rb b/Library/Homebrew/keg.rb index 74fd88c2e2..b7af6427f3 100644 --- a/Library/Homebrew/keg.rb +++ b/Library/Homebrew/keg.rb @@ -385,6 +385,7 @@ class Keg end def installed_dependents + return [] unless linked? tap = Tab.for_keg(self).source["tap"] Keg.all.select do |keg| tab = Tab.for_keg(keg) @@ -394,12 +395,10 @@ class Keg # in case of conflicts between formulae from different taps. begin dep_formula = Formulary.factory(dep["full_name"]) - next false unless dep_formula == to_formula + dep_formula == to_formula rescue FormulaUnavailableError - next false unless "#{tap}/#{name}" == dep["full_name"] + next "#{tap}/#{name}" == dep["full_name"] end - - dep["version"] == version.to_s end end end diff --git a/Library/Homebrew/test/keg_test.rb b/Library/Homebrew/test/keg_test.rb index 660ccd8829..7b396b5636 100644 --- a/Library/Homebrew/test/keg_test.rb +++ b/Library/Homebrew/test/keg_test.rb @@ -340,6 +340,7 @@ class InstalledDependantsTests < LinkTestCase def setup super @dependent = setup_test_keg("bar", "1.0") + @keg.link end def alter_tab(keg = @dependent) @@ -442,8 +443,8 @@ class InstalledDependantsTests < LinkTestCase def test_same_name_different_version_in_tab dependencies [{ "full_name" => "foo", "version" => "1.1" }] - assert_empty @keg.installed_dependents - assert_nil Keg.find_some_installed_dependents([@keg]) + assert_equal [@dependent], @keg.installed_dependents + assert_equal [[@keg], ["bar 1.0"]], Keg.find_some_installed_dependents([@keg]) end def test_different_name_same_version_in_tab @@ -465,4 +466,11 @@ class InstalledDependantsTests < LinkTestCase assert_empty @keg.installed_dependents assert_equal [[@keg], ["bar"]], Keg.find_some_installed_dependents([@keg]) end + + def test_unlinked + @keg.unlink + dependencies [{ "full_name" => "foo", "version" => "1.0" }] + assert_empty @keg.installed_dependents + assert_nil Keg.find_some_installed_dependents([@keg]) + end end From 94ead557723491306515a67138b649d67e8299e0 Mon Sep 17 00:00:00 2001 From: Alyssa Ross Date: Thu, 17 Nov 2016 17:18:48 +0000 Subject: [PATCH 2/4] keg: keg_only kegs can have installed dependents --- Library/Homebrew/keg.rb | 2 +- Library/Homebrew/test/keg_test.rb | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Library/Homebrew/keg.rb b/Library/Homebrew/keg.rb index b7af6427f3..511d79687a 100644 --- a/Library/Homebrew/keg.rb +++ b/Library/Homebrew/keg.rb @@ -385,7 +385,7 @@ class Keg end def installed_dependents - return [] unless linked? + return [] if !linked? && !to_formula.keg_only? tap = Tab.for_keg(self).source["tap"] Keg.all.select do |keg| tab = Tab.for_keg(keg) diff --git a/Library/Homebrew/test/keg_test.rb b/Library/Homebrew/test/keg_test.rb index 7b396b5636..de32c55e53 100644 --- a/Library/Homebrew/test/keg_test.rb +++ b/Library/Homebrew/test/keg_test.rb @@ -473,4 +473,12 @@ class InstalledDependantsTests < LinkTestCase assert_empty @keg.installed_dependents assert_nil Keg.find_some_installed_dependents([@keg]) end + + def test_keg_only + @keg.unlink + Formula["foo"].class.keg_only "a good reason" + dependencies [{ "full_name" => "foo", "version" => "1.1" }] # different version + assert_equal [@dependent], @keg.installed_dependents + assert_equal [[@keg], ["bar 1.0"]], Keg.find_some_installed_dependents([@keg]) + end end From e4856143a6a43a306101abcbf0f2d71d00354a18 Mon Sep 17 00:00:00 2001 From: Alyssa Ross Date: Tue, 29 Nov 2016 00:50:00 +0000 Subject: [PATCH 3/4] keg: check installed dependencies iff optlinked --- Library/Homebrew/keg.rb | 2 +- Library/Homebrew/test/keg_test.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Library/Homebrew/keg.rb b/Library/Homebrew/keg.rb index 511d79687a..f3aab7f977 100644 --- a/Library/Homebrew/keg.rb +++ b/Library/Homebrew/keg.rb @@ -385,7 +385,7 @@ class Keg end def installed_dependents - return [] if !linked? && !to_formula.keg_only? + return [] unless optlinked? tap = Tab.for_keg(self).source["tap"] Keg.all.select do |keg| tab = Tab.for_keg(keg) diff --git a/Library/Homebrew/test/keg_test.rb b/Library/Homebrew/test/keg_test.rb index de32c55e53..40b47b5e9d 100644 --- a/Library/Homebrew/test/keg_test.rb +++ b/Library/Homebrew/test/keg_test.rb @@ -467,8 +467,8 @@ class InstalledDependantsTests < LinkTestCase assert_equal [[@keg], ["bar"]], Keg.find_some_installed_dependents([@keg]) end - def test_unlinked - @keg.unlink + def test_nonoptlinked + @keg.remove_opt_record dependencies [{ "full_name" => "foo", "version" => "1.0" }] assert_empty @keg.installed_dependents assert_nil Keg.find_some_installed_dependents([@keg]) From e1d7d44e5a13d16bc7773a7afb09c1a789878f5a Mon Sep 17 00:00:00 2001 From: Alyssa Ross Date: Fri, 23 Dec 2016 17:29:29 +0000 Subject: [PATCH 4/4] tests: optlink fake kegs in uninstall test --- Library/Homebrew/test/uninstall_test.rb | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Library/Homebrew/test/uninstall_test.rb b/Library/Homebrew/test/uninstall_test.rb index e7849178b3..597e77e40d 100644 --- a/Library/Homebrew/test/uninstall_test.rb +++ b/Library/Homebrew/test/uninstall_test.rb @@ -9,7 +9,10 @@ class UninstallTests < Homebrew::TestCase depends_on "dependency" end - [@dependency, @dependent].each { |f| f.installed_prefix.mkpath } + [@dependency, @dependent].each do |f| + f.installed_prefix.mkpath + Keg.new(f.installed_prefix).optlink + end tab = Tab.empty tab.homebrew_version = "1.1.6" @@ -25,7 +28,10 @@ class UninstallTests < Homebrew::TestCase def teardown Homebrew.failed = false - [@dependency, @dependent].each { |f| f.rack.rmtree } + [@dependency, @dependent].each do |f| + f.installed_kegs.each(&:remove_opt_record) + f.rack.rmtree + end end def handle_unsatisfied_dependents