diff options
| author | Jack Nagel | 2012-08-19 00:33:35 -0500 |
|---|---|---|
| committer | Jack Nagel | 2012-08-19 12:04:44 -0500 |
| commit | bbc167b9e724a1d875abecc175b46890800d5c8f (patch) | |
| tree | a55aedb0f05b9c66f9cac036f03723a3c2fcce5e | |
| parent | f33f3eafe6d512864feaa43e70cfc6cfa269aded (diff) | |
| download | homebrew-bbc167b9e724a1d875abecc175b46890800d5c8f.tar.bz2 | |
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>
| -rw-r--r-- | Library/Homebrew/formula.rb | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index 57e5f76de..773b6d746 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -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 |
