aboutsummaryrefslogtreecommitdiffstats
path: root/Library
diff options
context:
space:
mode:
authorJack Nagel2013-12-09 14:36:10 -0600
committerJack Nagel2013-12-09 14:36:10 -0600
commitefd79462a134a6e7643e7e80f7488081beffac92 (patch)
treeda95fee0349a08b9ad7c4c87955e064c61fd9da4 /Library
parentc7a8a0b3a63e5bad521e42babf745880d5ec3f53 (diff)
downloadhomebrew-efd79462a134a6e7643e7e80f7488081beffac92.tar.bz2
Expand requirements of default deps added by other requirements
Dependencies built from requirements with a default formula may themselves have requirements, and these requirements may have default formulae, which may have more requirements, etc., so we have to keep expanding until this isn't the case. Fixes #25025. Fixes #25037.
Diffstat (limited to 'Library')
-rw-r--r--Library/Homebrew/formula_installer.rb68
1 files changed, 44 insertions, 24 deletions
diff --git a/Library/Homebrew/formula_installer.rb b/Library/Homebrew/formula_installer.rb
index 1baa93c1e..fb8a2d296 100644
--- a/Library/Homebrew/formula_installer.rb
+++ b/Library/Homebrew/formula_installer.rb
@@ -17,7 +17,6 @@ class FormulaInstaller
attr_reader :f
attr_accessor :tab, :options, :ignore_deps
attr_accessor :show_summary_heading, :show_header
- attr_reader :requirement_deps
def initialize ff
@f = ff
@@ -25,7 +24,6 @@ class FormulaInstaller
@ignore_deps = ARGV.ignore_deps? || ARGV.interactive?
@options = Options.new
@tab = Tab.dummy_tab(ff)
- @requirement_deps = []
@@attempted ||= Set.new
@@ -168,37 +166,59 @@ class FormulaInstaller
def compute_and_install_dependencies
perform_readline_hack
- check_requirements
- deps = [].concat(f.deps).concat(requirement_deps)
+ req_map, req_deps = expand_requirements
+
+ check_requirements(req_map)
+
+ deps = [].concat(req_deps).concat(f.deps)
install_dependencies expand_dependencies(deps)
- ensure
- requirement_deps.clear
- end
-
- def check_requirements
- unsatisfied = ARGV.filter_for_dependencies do
- f.recursive_requirements do |dependent, req|
- if (req.optional? || req.recommended?) && dependent.build.without?(req)
- Requirement.prune
- elsif req.build? && install_bottle?(dependent)
- Requirement.prune
- elsif req.satisfied?
- Requirement.prune
- elsif req.default_formula?
- requirement_deps << req.to_dependency
- Requirement.prune
- else
- puts "#{dependent}: #{req.message}"
- end
+ end
+
+ def check_requirements(req_map)
+ fatals = []
+
+ req_map.each_pair do |dependent, reqs|
+ reqs.each do |req|
+ puts "#{dependent}: #{req.message}"
+ fatals << req if req.fatal?
end
end
- fatals = unsatisfied.select(&:fatal?)
raise UnsatisfiedRequirements.new(f, fatals) unless fatals.empty?
end
+ def expand_requirements
+ unsatisfied_reqs = Hash.new { |h, k| h[k] = [] }
+ deps = []
+ formulae = [f]
+
+ while f = formulae.pop
+
+ ARGV.filter_for_dependencies do
+ f.recursive_requirements do |dependent, req|
+ if (req.optional? || req.recommended?) && dependent.build.without?(req)
+ Requirement.prune
+ elsif req.build? && install_bottle?(dependent)
+ Requirement.prune
+ elsif req.satisfied?
+ Requirement.prune
+ elsif req.default_formula?
+ dep = req.to_dependency
+ deps.unshift(dep)
+ formulae.unshift(dep.to_formula)
+ Requirement.prune
+ else
+ unsatisfied_reqs[dependent] << req
+ end
+ end
+ end
+ end
+
+ return unsatisfied_reqs, deps
+ end
+
def expand_dependencies(deps)
# FIXME: can't check this inside the block for the top-level dependent
# because it depends on the contents of ARGV.