aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/keg.rb
diff options
context:
space:
mode:
authorAlyssa Ross2016-09-30 14:16:00 +0100
committerAlyssa Ross2016-10-25 22:34:35 +0100
commitae3f53a1ecb19ea70e5d461a3205e6434bbe0c56 (patch)
treee2805fd6242e8d47fb004565e6bd449ae3d5f7e8 /Library/Homebrew/keg.rb
parentc88b67f3a8f7e90ad974eaf82d00fd88827a1e4c (diff)
downloadbrew-ae3f53a1ecb19ea70e5d461a3205e6434bbe0c56.tar.bz2
keg: fallback to missing_deps if deps not in tab
Diffstat (limited to 'Library/Homebrew/keg.rb')
-rw-r--r--Library/Homebrew/keg.rb24
1 files changed, 22 insertions, 2 deletions
diff --git a/Library/Homebrew/keg.rb b/Library/Homebrew/keg.rb
index 257594671..dfc27b55a 100644
--- a/Library/Homebrew/keg.rb
+++ b/Library/Homebrew/keg.rb
@@ -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)