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:
parent
53cf970312
commit
c38bc4fd67
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@ -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|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user