keg: fallback to missing_deps if deps not in tab
This commit is contained in:
parent
c88b67f3a8
commit
ae3f53a1ec
@ -1,6 +1,7 @@
|
|||||||
require "extend/pathname"
|
require "extend/pathname"
|
||||||
require "keg_relocate"
|
require "keg_relocate"
|
||||||
require "formula_lock"
|
require "formula_lock"
|
||||||
|
require "diagnostic"
|
||||||
require "ostruct"
|
require "ostruct"
|
||||||
|
|
||||||
class Keg
|
class Keg
|
||||||
@ -297,14 +298,33 @@ class Keg
|
|||||||
end
|
end
|
||||||
|
|
||||||
def installed_dependents
|
def installed_dependents
|
||||||
Formula.installed.flat_map(&:installed_kegs).select do |keg|
|
installed_kegs = Formula.installed.flat_map(&:installed_kegs)
|
||||||
Tab.for_keg(keg).runtime_dependencies.any? do |dep|
|
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
|
# 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.
|
||||||
dep_formula = Formulary.factory(dep["full_name"])
|
dep_formula = Formulary.factory(dep["full_name"])
|
||||||
dep_formula == to_formula && dep["version"] == version.to_s
|
dep_formula == to_formula && dep["version"] == version.to_s
|
||||||
end
|
end
|
||||||
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
|
end
|
||||||
|
|
||||||
def find(*args, &block)
|
def find(*args, &block)
|
||||||
|
@ -339,8 +339,29 @@ class InstalledDependantsTests < LinkTests
|
|||||||
tab.write
|
tab.write
|
||||||
end
|
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
|
def test_no_dependencies
|
||||||
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
|
assert_empty @keg.installed_dependents
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user