From c38bc4fd677bd5dfaaab418748e1196c13635852 Mon Sep 17 00:00:00 2001 From: Jack Nagel Date: Tue, 14 Aug 2012 23:13:18 -0500 Subject: 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 --- Library/Homebrew/dependencies.rb | 6 ++++-- Library/Homebrew/formula_installer.rb | 24 ++++++------------------ 2 files changed, 10 insertions(+), 20 deletions(-) (limited to 'Library') diff --git a/Library/Homebrew/dependencies.rb b/Library/Homebrew/dependencies.rb index c4b8f0b67..44584242a 100644 --- a/Library/Homebrew/dependencies.rb +++ b/Library/Homebrew/dependencies.rb @@ -137,7 +137,7 @@ class Requirement end def hash - @message.hash + message.hash end end @@ -194,7 +194,6 @@ end # This requirement is used to require an X11 implementation, # optionally with a minimum version number. class X11Dependency < Requirement - def initialize min_version=nil @min_version = min_version end @@ -216,6 +215,9 @@ class X11Dependency < Requirement ENV.x11 end + def hash + "X11".hash + end end diff --git a/Library/Homebrew/formula_installer.rb b/Library/Homebrew/formula_installer.rb index 97ab036f6..8e8770db7 100644 --- a/Library/Homebrew/formula_installer.rb +++ b/Library/Homebrew/formula_installer.rb @@ -66,26 +66,14 @@ class FormulaInstaller EOS end - # 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 + unless ignore_deps + needed_reqs = f.recursive_requirements.reject { |r| r.satisfied? } + puts needed_reqs.map { |r| r.message } * "\n" + unsatisfied_fatals = needed_reqs.select { |r| r.fatal? } + unless unsatisfied_fatals.empty? + raise UnsatisfiedRequirements.new(f, unsatisfied_fatals) 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? needed_deps.each do |dep| -- cgit v1.2.3