aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew
diff options
context:
space:
mode:
authorJack Nagel2013-12-09 14:36:10 -0600
committerJack Nagel2013-12-09 14:36:10 -0600
commitf579d9045887ee3bf021d052d7de8734b94e1dec (patch)
tree97ddf6b4a9ab5968b33f3c6dbcbafaec35dae8a3 /Library/Homebrew
parent08055e1776c166d26bdce0995ee16cfabec392f0 (diff)
downloadbrew-f579d9045887ee3bf021d052d7de8734b94e1dec.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 Homebrew/homebrew#25025. Fixes Homebrew/homebrew#25037.
Diffstat (limited to 'Library/Homebrew')
-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.