factory: don't reload previously defined formulae

build.rb calls Formula.factory to get a usable Formula object to pass to
its install method. However, because the formula file is the actual
executing script, its class is already defined, and loading it again
causes the class to be re-evaluated, which, unfortunately, is not
idempotent.

This bug has existed for a very long time, and its side effects include
duplicate entries the deps array and mirrors array, among others.
Fortunately, the fix is very simple.

Signed-off-by: Jack Nagel <jacknagel@gmail.com>
This commit is contained in:
Jack Nagel 2012-08-19 00:33:35 -05:00
parent c6b3cd7cf4
commit 35e32f352d

View File

@ -377,20 +377,22 @@ class Formula
else
name = Formula.canonical_name(name)
# If name was a path or mapped to a cached formula
if name.include? "/"
require name
if name.include? "/"
# require allows filenames to drop the .rb extension, but everything else
# in our codebase will require an exact and fullpath.
name = "#{name}.rb" unless name =~ /\.rb$/
path = Pathname.new(name)
name = path.stem
require path unless Object.const_defined? self.class_s(name)
install_type = :from_path
target_file = path.to_s
else
# For names, map to the path and then require
require Formula.path(name)
require Formula.path(name) unless Object.const_defined? self.class_s(name)
install_type = :from_name
end
end