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:
parent
08055e1776
commit
f579d90458
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user