Allow multiple unsatisfied fatal requirements

Closes Homebrew/homebrew#13335.
This commit is contained in:
Adam Vandenberg 2012-07-23 17:06:38 -07:00
parent bcde6432f3
commit 8c8701f268
6 changed files with 35 additions and 21 deletions

View File

@ -56,7 +56,7 @@ at_exit do
end
def install f
f.external_deps.each { |dep| dep.modify_build_environment }
f.requirements.each { |dep| dep.modify_build_environment }
f.recursive_deps.uniq.each do |dep|
dep = Formula.factory dep

View File

@ -19,11 +19,11 @@ class DependencyCollector
:chicken, :jruby, :lua, :node, :perl, :python, :rbx, :ruby
].freeze
attr_reader :deps, :external_deps
attr_reader :deps, :requirements
def initialize
@deps = Dependencies.new
@external_deps = Set.new
@requirements = Set.new
end
def add spec
@ -35,7 +35,7 @@ class DependencyCollector
# dependency needed for the current platform.
return if dep.nil?
# Add dep to the correct bucket
(dep.is_a?(Requirement) ? @external_deps : @deps) << dep
(dep.is_a?(Requirement) ? @requirements : @deps) << dep
end
private

View File

@ -65,12 +65,15 @@ class FormulaInstallationAlreadyAttemptedError < Homebrew::InstallationError
end
end
class UnsatisfiedRequirement < Homebrew::InstallationError
attr :dep
class UnsatisfiedRequirements < Homebrew::InstallationError
attr :reqs
def initialize formula, dep
@dep = dep
super formula, "An unsatisfied requirement failed this build."
def initialize formula, reqs
@reqs = reqs
message = (reqs.length == 1) \
? "An unsatisfied requirement failed this build." \
: "Unsatisifed requirements failed this build."
super formula, message
end
end

View File

@ -423,7 +423,7 @@ class Formula
end
def deps; self.class.dependencies.deps; end
def external_deps; self.class.dependencies.external_deps; end
def requirements; self.class.dependencies.requirements; end
# deps are in an installable order
# which means if a depends on b then b will be ordered before a in this list

View File

@ -43,7 +43,8 @@ class FormulaInstaller
f.recursive_deps.each do |dep|
if dep.installed? and not dep.keg_only? and not dep.linked_keg.directory?
raise CannotInstallFormulaError, "You must `brew link #{dep}' before #{f} can be installed"
raise CannotInstallFormulaError,
"You must `brew link #{dep}' before #{f} can be installed"
end
end unless ignore_deps
@ -66,15 +67,25 @@ class FormulaInstaller
EOS
end
f.external_deps.each do |dep|
unless dep.satisfied?
puts dep.message
if dep.fatal? and not ignore_deps
raise UnsatisfiedRequirement.new(f, dep)
# Build up a list of unsatisifed fatal requirements
first_message = true
unsatisfied_fatals = []
f.requirements.each do |req|
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?
raise UnsatisfiedRequirements.new(f, unsatisfied_fatals)
end
unless ignore_deps
needed_deps = f.recursive_deps.reject{ |d| d.installed? }
unless needed_deps.empty?

View File

@ -12,9 +12,9 @@ class ExternalDepsTests < Test::Unit::TestCase
end
# Should have found a dep
assert d.external_deps.size == 1
assert d.requirements.size == 1
d.external_deps do |dep|
d.requirements do |req|
assert !d.satisfied?
end
end
@ -26,9 +26,9 @@ class ExternalDepsTests < Test::Unit::TestCase
end
# Should have found a dep
assert d.external_deps.size == 1
assert d.requirements.size == 1
d.external_deps do |dep|
d.requirements do |req|
assert d.satisfied?
end
end