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