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.
This commit is contained in:
Jack Nagel 2013-12-09 14:36:10 -06:00
parent 08055e1776
commit f579d90458

View File

@ -17,7 +17,6 @@ class FormulaInstaller
attr_reader :f attr_reader :f
attr_accessor :tab, :options, :ignore_deps attr_accessor :tab, :options, :ignore_deps
attr_accessor :show_summary_heading, :show_header attr_accessor :show_summary_heading, :show_header
attr_reader :requirement_deps
def initialize ff def initialize ff
@f = ff @f = ff
@ -25,7 +24,6 @@ class FormulaInstaller
@ignore_deps = ARGV.ignore_deps? || ARGV.interactive? @ignore_deps = ARGV.ignore_deps? || ARGV.interactive?
@options = Options.new @options = Options.new
@tab = Tab.dummy_tab(ff) @tab = Tab.dummy_tab(ff)
@requirement_deps = []
@@attempted ||= Set.new @@attempted ||= Set.new
@ -168,35 +166,57 @@ class FormulaInstaller
def compute_and_install_dependencies def compute_and_install_dependencies
perform_readline_hack 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) install_dependencies expand_dependencies(deps)
ensure
requirement_deps.clear
end end
def check_requirements def check_requirements(req_map)
unsatisfied = ARGV.filter_for_dependencies do fatals = []
f.recursive_requirements do |dependent, req|
if (req.optional? || req.recommended?) && dependent.build.without?(req) req_map.each_pair do |dependent, reqs|
Requirement.prune reqs.each do |req|
elsif req.build? && install_bottle?(dependent) puts "#{dependent}: #{req.message}"
Requirement.prune fatals << req if req.fatal?
elsif req.satisfied? end
Requirement.prune end
elsif req.default_formula?
requirement_deps << req.to_dependency raise UnsatisfiedRequirements.new(f, fatals) unless fatals.empty?
Requirement.prune end
else
puts "#{dependent}: #{req.message}" 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 end
end end
fatals = unsatisfied.select(&:fatal?) return unsatisfied_reqs, deps
raise UnsatisfiedRequirements.new(f, fatals) unless fatals.empty?
end end
def expand_dependencies(deps) def expand_dependencies(deps)