Merge pull request #1737 from alyssais/tap_dependents

keg: installed dependencies of unknown formulae
This commit is contained in:
Mike McQuaid 2016-12-29 14:28:59 +00:00 committed by GitHub
commit 577bf628e8
2 changed files with 30 additions and 9 deletions

View File

@ -139,6 +139,10 @@ class Keg
raise NotAKegError, "#{path} is not inside a keg" raise NotAKegError, "#{path} is not inside a keg"
end end
def self.all
Formula.racks.flat_map(&:subdirs).map { |d| new(d) }
end
attr_reader :path, :name, :linked_keg_record, :opt_record attr_reader :path, :name, :linked_keg_record, :opt_record
protected :path protected :path
@ -353,14 +357,21 @@ class Keg
end end
def installed_dependents 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) tab = Tab.for_keg(keg)
next if tab.runtime_dependencies.nil? # no dependency information saved. next if tab.runtime_dependencies.nil? # no dependency information saved.
tab.runtime_dependencies.any? do |dep| tab.runtime_dependencies.any? do |dep|
# Resolve formula rather than directly comparing names # Resolve formula rather than directly comparing names
# in case of conflicts between formulae from different taps. # in case of conflicts between formulae from different taps.
begin
dep_formula = Formulary.factory(dep["full_name"]) dep_formula = Formulary.factory(dep["full_name"])
dep_formula == to_formula && dep["version"] == version.to_s 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 end
end end

View File

@ -2,7 +2,7 @@ require "testing_env"
require "keg" require "keg"
require "stringio" require "stringio"
class LinkTests < Homebrew::TestCase class LinkTestCase < Homebrew::TestCase
include FileUtils include FileUtils
def setup_test_keg(name, version) def setup_test_keg(name, version)
@ -44,6 +44,13 @@ class LinkTests < Homebrew::TestCase
rmtree HOMEBREW_PREFIX/"bin" rmtree HOMEBREW_PREFIX/"bin"
rmtree HOMEBREW_PREFIX/"lib" rmtree HOMEBREW_PREFIX/"lib"
end end
end
class LinkTests < LinkTestCase
def test_all
Formula.clear_racks_cache
assert_equal [@keg], Keg.all
end
def test_empty_installation def test_empty_installation
%w[.DS_Store INSTALL_RECEIPT.json LICENSE.txt].each do |file| %w[.DS_Store INSTALL_RECEIPT.json LICENSE.txt].each do |file|
@ -315,7 +322,7 @@ class LinkTests < Homebrew::TestCase
end end
end end
class InstalledDependantsTests < LinkTests class InstalledDependantsTests < LinkTestCase
def stub_formula_name(name) def stub_formula_name(name)
f = formula(name) { url "foo-1.0" } f = formula(name) { url "foo-1.0" }
stub_formula_loader f stub_formula_loader f
@ -353,10 +360,13 @@ class InstalledDependantsTests < LinkTests
# from a file path or URL. # from a file path or URL.
def test_unknown_formula def test_unknown_formula
Formulary.unstub(:loader_for) Formulary.unstub(:loader_for)
dependencies [] alter_tab(@keg) do |t|
alter_tab { |t| t.source["path"] = nil } t.source["tap"] = "some/tap"
assert_empty @keg.installed_dependents t.source["path"] = nil
assert_nil Keg.find_some_installed_dependents([@keg]) 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 end
def test_no_dependencies_anywhere def test_no_dependencies_anywhere