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
unless ignore_deps
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)
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? }
end
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
needed_deps = f.recursive_deps.reject{ |d| d.installed? }
unless needed_deps.empty?
needed_deps.each do |dep|
if dep.explicitly_requested?