Recursively expand requirements in FormulaInstaller

Currently FormulaInstaller "forgets" about the requirements of
dependencies, as dependencies are recursively expanded by the first
FormulaInstaller instance, and then ignored by subsequent instances to
prevent duplicate installation attempts. These requirements then have
their messages displayed, but the fatal check is skipped and thus no
exception is raised.

Now that we have Formula#recursive_requirements, we can mirror what we
are doing with dependencies and recursively expand requirements up
front.

While at it, fix a bug in determining Requirement equality that resulted
in unique requirements being eliminated from a formula's set of
recursive requirements.

Fixes Homebrew/homebrew#12290.
Fixes Homebrew/homebrew#14084.

Signed-off-by: Jack Nagel <jacknagel@gmail.com>
This commit is contained in:
Jack Nagel 2012-08-14 23:13:18 -05:00
parent 53cf970312
commit c38bc4fd67
2 changed files with 11 additions and 21 deletions

View File

@ -137,7 +137,7 @@ class Requirement
end end
def hash def hash
@message.hash message.hash
end end
end end
@ -194,7 +194,6 @@ end
# This requirement is used to require an X11 implementation, # This requirement is used to require an X11 implementation,
# optionally with a minimum version number. # optionally with a minimum version number.
class X11Dependency < Requirement class X11Dependency < Requirement
def initialize min_version=nil def initialize min_version=nil
@min_version = min_version @min_version = min_version
end end
@ -216,6 +215,9 @@ class X11Dependency < Requirement
ENV.x11 ENV.x11
end end
def hash
"X11".hash
end
end end

View File

@ -66,26 +66,14 @@ class FormulaInstaller
EOS EOS
end end
# Build up a list of unsatisifed fatal requirements unless ignore_deps
first_message = true needed_reqs = f.recursive_requirements.reject { |r| r.satisfied? }
unsatisfied_fatals = [] puts needed_reqs.map { |r| r.message } * "\n"
f.requirements.each do |req| unsatisfied_fatals = needed_reqs.select { |r| r.fatal? }
unless req.satisfied?
# Newline between multiple messages
puts unless first_message
puts req.message
first_message = false
if req.fatal? and not ignore_deps
unsatisfied_fatals << req
end
end
end
unless unsatisfied_fatals.empty? unless unsatisfied_fatals.empty?
raise UnsatisfiedRequirements.new(f, unsatisfied_fatals) raise UnsatisfiedRequirements.new(f, unsatisfied_fatals)
end end
unless ignore_deps
needed_deps = f.recursive_deps.reject{ |d| d.installed? } needed_deps = f.recursive_deps.reject{ |d| d.installed? }
unless needed_deps.empty? unless needed_deps.empty?
needed_deps.each do |dep| needed_deps.each do |dep|