diff options
| author | Jack Nagel | 2013-12-09 14:36:10 -0600 |
|---|---|---|
| committer | Jack Nagel | 2013-12-09 14:36:10 -0600 |
| commit | efd79462a134a6e7643e7e80f7488081beffac92 (patch) | |
| tree | da95fee0349a08b9ad7c4c87955e064c61fd9da4 /Library | |
| parent | c7a8a0b3a63e5bad521e42babf745880d5ec3f53 (diff) | |
| download | homebrew-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.rb | 68 |
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. |
