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:
parent
c6b3cd7cf4
commit
35e32f352d
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user