From 0a20edf9454423537a7f4d3b3659ad56f0151775 Mon Sep 17 00:00:00 2001 From: Alyssa Ross Date: Thu, 17 Nov 2016 16:16:31 +0000 Subject: [PATCH 1/3] tests: don't run LinkTests twice see #1526 --- Library/Homebrew/test/keg_test.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Library/Homebrew/test/keg_test.rb b/Library/Homebrew/test/keg_test.rb index 2c91027e5b..b875c7205b 100644 --- a/Library/Homebrew/test/keg_test.rb +++ b/Library/Homebrew/test/keg_test.rb @@ -2,7 +2,7 @@ require "testing_env" require "keg" require "stringio" -class LinkTests < Homebrew::TestCase +class LinkTestCase < Homebrew::TestCase include FileUtils def setup_test_keg(name, version) @@ -44,7 +44,9 @@ class LinkTests < Homebrew::TestCase rmtree HOMEBREW_PREFIX/"bin" rmtree HOMEBREW_PREFIX/"lib" end +end +class LinkTests < LinkTestCase def test_empty_installation %w[.DS_Store INSTALL_RECEIPT.json LICENSE.txt].each do |file| touch @keg/file @@ -315,7 +317,7 @@ class LinkTests < Homebrew::TestCase end end -class InstalledDependantsTests < LinkTests +class InstalledDependantsTests < LinkTestCase def stub_formula_name(name) f = formula(name) { url "foo-1.0" } stub_formula_loader f From e5d7e13c63e7e942f3acdd5c0fac7bed624f52c4 Mon Sep 17 00:00:00 2001 From: Alyssa Ross Date: Tue, 27 Dec 2016 17:26:21 +0000 Subject: [PATCH 2/3] keg: installed dependencies of unknown formulae Previously, trying to resolve the dependencies of a keg would raise an exception if the formulae for any of the dependencies could not be found (e.g. if it had been moved to another tap). This commit updates the dependency finding logic to catch these exceptions, and fall back to comparing names and taps of formulae, which should give the correct behaviour. Fixes #1586. --- Library/Homebrew/keg.rb | 17 ++++++++++++++--- Library/Homebrew/test/keg_test.rb | 12 +++++++++--- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/Library/Homebrew/keg.rb b/Library/Homebrew/keg.rb index 1de4ce1f0c..3d2d21d692 100644 --- a/Library/Homebrew/keg.rb +++ b/Library/Homebrew/keg.rb @@ -139,6 +139,10 @@ class Keg raise NotAKegError, "#{path} is not inside a keg" end + def self.all + Formula.racks.flat_map(&:subdirs).map { |d| new(d) } + end + attr_reader :path, :name, :linked_keg_record, :opt_record protected :path @@ -353,14 +357,21 @@ class Keg end def installed_dependents - Formula.installed.flat_map(&:installed_kegs).select do |keg| + my_tab = Tab.for_keg(self) + Keg.all.select do |keg| tab = Tab.for_keg(keg) next if tab.runtime_dependencies.nil? # no dependency information saved. tab.runtime_dependencies.any? do |dep| # Resolve formula rather than directly comparing names # in case of conflicts between formulae from different taps. - dep_formula = Formulary.factory(dep["full_name"]) - dep_formula == to_formula && dep["version"] == version.to_s + begin + dep_formula = Formulary.factory(dep["full_name"]) + next false unless dep_formula == to_formula + rescue FormulaUnavailableError + next false unless my_tab["full_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 b875c7205b..cf5f13a6c9 100644 --- a/Library/Homebrew/test/keg_test.rb +++ b/Library/Homebrew/test/keg_test.rb @@ -47,6 +47,11 @@ class LinkTestCase < Homebrew::TestCase end class LinkTests < LinkTestCase + def test_all + Formula.clear_racks_cache + assert_equal [@keg], Keg.all + end + def test_empty_installation %w[.DS_Store INSTALL_RECEIPT.json LICENSE.txt].each do |file| touch @keg/file @@ -355,10 +360,11 @@ class InstalledDependantsTests < LinkTestCase # from a file path or URL. def test_unknown_formula Formulary.unstub(:loader_for) - dependencies [] + alter_tab { |t| t.source["tap"] = "some/tap" } + dependencies [{ "full_name" => "some/tap/bar", "version" => "1.0" }] alter_tab { |t| t.source["path"] = nil } - 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_no_dependencies_anywhere From 3a27d8121970dab95f2d28db81189ddf9619c0f5 Mon Sep 17 00:00:00 2001 From: Alyssa Ross Date: Tue, 27 Dec 2016 22:58:44 +0000 Subject: [PATCH 3/3] keg: fix dependents with unavailable formulae Because of an accidental use of `=` instead of `==`, the source formula check would be skipped when determining if a keg depended on another one (so only the versions would be compared). Fixed that comparison, and updated the corresponding test. Glad I caught that! --- Library/Homebrew/keg.rb | 4 ++-- Library/Homebrew/test/keg_test.rb | 8 +++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Library/Homebrew/keg.rb b/Library/Homebrew/keg.rb index 3d2d21d692..756b272885 100644 --- a/Library/Homebrew/keg.rb +++ b/Library/Homebrew/keg.rb @@ -357,7 +357,7 @@ class Keg end def installed_dependents - my_tab = Tab.for_keg(self) + tap = Tab.for_keg(self).source["tap"] Keg.all.select do |keg| tab = Tab.for_keg(keg) next if tab.runtime_dependencies.nil? # no dependency information saved. @@ -368,7 +368,7 @@ class Keg dep_formula = Formulary.factory(dep["full_name"]) next false unless dep_formula == to_formula rescue FormulaUnavailableError - next false unless my_tab["full_name"] = dep["full_name"] + next false unless "#{tap}/#{name}" == dep["full_name"] end dep["version"] == version.to_s diff --git a/Library/Homebrew/test/keg_test.rb b/Library/Homebrew/test/keg_test.rb index cf5f13a6c9..4fe7c6a3cf 100644 --- a/Library/Homebrew/test/keg_test.rb +++ b/Library/Homebrew/test/keg_test.rb @@ -360,9 +360,11 @@ class InstalledDependantsTests < LinkTestCase # from a file path or URL. def test_unknown_formula Formulary.unstub(:loader_for) - alter_tab { |t| t.source["tap"] = "some/tap" } - dependencies [{ "full_name" => "some/tap/bar", "version" => "1.0" }] - alter_tab { |t| t.source["path"] = nil } + alter_tab(@keg) do |t| + t.source["tap"] = "some/tap" + t.source["path"] = nil + end + dependencies [{ "full_name" => "some/tap/foo", "version" => "1.0" }] assert_equal [@dependent], @keg.installed_dependents assert_equal [[@keg], ["bar 1.0"]], Keg.find_some_installed_dependents([@keg]) end