Skip to content

Commit

Permalink
factory: don't reload previously defined formulae
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
jacknagel committed Aug 19, 2012
1 parent 8e5e228 commit 1973d2a
Showing 1 changed file with 5 additions and 3 deletions.
8 changes: 5 additions & 3 deletions Library/Homebrew/formula.rb
Original file line number Diff line number Diff line change
Expand Up @@ -377,20 +377,22 @@ def self.factory name
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
Expand Down

0 comments on commit 1973d2a

Please sign in to comment.