FormulaInstaller: filter ARGV when testing for installed deps

In FormulaInstaller#install, needed_deps is created without first
filtering ARGV for flags like --HEAD. In practice, this means that
sometimes needed_deps will contain dependencies that are actually
already installed; --HEAD causes Formula#installed_prefix to differ and
thus checking Formula#installed? will result in false negatives.

This can trigger weird bugs; for example, Homebrew/homebrew#10380, where the "Installing
foo" header is displayed even though no dependencies were previously
installed.

Fix this by filtering ARGV before testing for installed dependencies,
and do the same for requirements to maintain symmetry, and because some
requiremnts check Formula#installed? as well.

Fixes Homebrew/homebrew#10380.

Signed-off-by: Jack Nagel <jacknagel@gmail.com>
This commit is contained in:
Jack Nagel 2012-08-15 18:52:25 -05:00
parent 140dc4c419
commit 83cdc64b40

View File

@ -67,14 +67,20 @@ class FormulaInstaller
end end
unless ignore_deps unless ignore_deps
needed_deps = []
needed_reqs = []
ARGV.filter_for_dependencies do
needed_deps = f.recursive_deps.reject{ |d| d.installed? }
needed_reqs = f.recursive_requirements.reject { |r| r.satisfied? } needed_reqs = f.recursive_requirements.reject { |r| r.satisfied? }
puts needed_reqs.map { |r| r.message } * "\n" unless needed_reqs.empty?
unsatisfied_fatals = needed_reqs.select { |r| r.fatal? }
unless unsatisfied_fatals.empty?
raise UnsatisfiedRequirements.new(f, unsatisfied_fatals)
end end
needed_deps = f.recursive_deps.reject{ |d| d.installed? } unless needed_reqs.empty?
puts needed_reqs.map { |r| r.message } * "\n"
fatals = needed_reqs.select { |r| r.fatal? }
raise UnsatisfiedRequirements.new(f, fatals) unless fatals.empty?
end
unless needed_deps.empty? unless needed_deps.empty?
needed_deps.each do |dep| needed_deps.each do |dep|
if dep.explicitly_requested? if dep.explicitly_requested?