keg: fallback to missing_deps if deps not in tab

This commit is contained in:
Alyssa Ross 2016-09-30 14:16:00 +01:00
parent c88b67f3a8
commit ae3f53a1ec
2 changed files with 43 additions and 2 deletions

View File

@ -1,6 +1,7 @@
require "extend/pathname"
require "keg_relocate"
require "formula_lock"
require "diagnostic"
require "ostruct"
class Keg
@ -297,14 +298,33 @@ class Keg
end
def installed_dependents
Formula.installed.flat_map(&:installed_kegs).select do |keg|
Tab.for_keg(keg).runtime_dependencies.any? do |dep|
installed_kegs = Formula.installed.flat_map(&:installed_kegs)
installed_kegs_and_tabs = installed_kegs.map { |k| [k, Tab.for_keg(k)] }
kegs_by_tab_deps_presence = installed_kegs_and_tabs.group_by do |_, tab|
!tab.runtime_dependencies.nil?
end
[true, false].each { |v| kegs_by_tab_deps_presence[v] ||= [] }
kegs_by_tab_deps_presence[true].select! do |_, tab|
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
end
end
remaining_kegs_and_tabs = kegs_by_tab_deps_presence[false]
remaining_formulae = remaining_kegs_and_tabs.map { |k, _| k.to_formula }
# Expensive if installed_dependents of multiple kegs are being checked
deps = Homebrew::Diagnostic.missing_deps(remaining_formulae, [name])
remaining_kegs_and_tabs.select! do |keg, _|
keg_deps = deps[keg.to_formula.full_name]
keg_deps && keg_deps.any?
end
kegs_by_tab_deps_presence.values.flatten(1).map { |k, _| k }
end
def find(*args, &block)

View File

@ -339,8 +339,29 @@ class InstalledDependantsTests < LinkTests
tab.write
end
def test_unknown_dependencies
dependencies nil
bar = formula "bar" do
url "bar-1.0"
depends_on "foo"
end
stub_formula_loader bar
assert_equal [@dependent], @keg.installed_dependents
end
def test_no_dependencies
dependencies []
# Make sure formula dependencies aren't checked when dependencies are
# recorded in the tab.
bar = formula "bar" do
url "bar-1.0"
depends_on "foo"
end
stub_formula_loader bar
assert_empty @keg.installed_dependents
end