diff --git a/Library/Homebrew/keg.rb b/Library/Homebrew/keg.rb index 1de4ce1f0c..756b272885 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| + 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. 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 "#{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 2c91027e5b..4fe7c6a3cf 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,6 +44,13 @@ class LinkTests < Homebrew::TestCase rmtree HOMEBREW_PREFIX/"bin" rmtree HOMEBREW_PREFIX/"lib" end +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| @@ -315,7 +322,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 @@ -353,10 +360,13 @@ class InstalledDependantsTests < LinkTests # from a file path or URL. def test_unknown_formula Formulary.unstub(:loader_for) - dependencies [] - alter_tab { |t| t.source["path"] = nil } - assert_empty @keg.installed_dependents - assert_nil Keg.find_some_installed_dependents([@keg]) + 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 def test_no_dependencies_anywhere