From 45a71898e8f06caf334e3c6baefb974504681744 Mon Sep 17 00:00:00 2001 From: Jack Nagel Date: Mon, 1 Jun 2015 19:20:11 -0400 Subject: [PATCH] Isolate formula class namespaces Closes Homebrew/homebrew#40151. Closes Homebrew/homebrew#40203. --- Library/Homebrew/formula_versions.rb | 4 -- Library/Homebrew/formulary.rb | 68 ++++++++-------------------- 2 files changed, 20 insertions(+), 52 deletions(-) diff --git a/Library/Homebrew/formula_versions.rb b/Library/Homebrew/formula_versions.rb index fa6446f361..715124406c 100644 --- a/Library/Homebrew/formula_versions.rb +++ b/Library/Homebrew/formula_versions.rb @@ -32,8 +32,6 @@ class FormulaVersions path = Pathname.pwd.join("#{name}.rb") path.write file_contents_at_revision(rev) - old_const = Formulary.unload_formula(name) - begin nostdout { yield Formulary.factory(path.to_s) } rescue *IGNORED_EXCEPTIONS => e @@ -42,8 +40,6 @@ class FormulaVersions ohai "#{e} in #{name} at revision #{rev}", e.backtrace if ARGV.debug? rescue FormulaUnavailableError # Suppress this error - ensure - Formulary.restore_formula(name, old_const) end end end diff --git a/Library/Homebrew/formulary.rb b/Library/Homebrew/formulary.rb index 398117ab93..65ab0b68f1 100644 --- a/Library/Homebrew/formulary.rb +++ b/Library/Homebrew/formulary.rb @@ -2,47 +2,30 @@ # It is not meant to be used directy from formulae. class Formulary - module Formulae - class << self - if instance_method(:const_defined?).arity == -1 - def formula_const_defined?(name) - const_defined?(name, false) - end + FORMULAE = {} - def formula_const_get(name) - const_get(name, false) - end - else - def formula_const_defined?(name) - const_defined?(name) - end + def self.formula_class_defined?(path) + FORMULAE.key?(path) + end - def formula_const_get(name) - const_get(name) - end - end + def self.formula_class_get(path) + FORMULAE.fetch(path) + end - def remove_formula_const(name) - remove_const(name) - end + def self.load_formula(name, path) + mod = Module.new + mod.module_eval(path.read, path) + class_name = class_s(name) - def formula_const_set(name, value) - const_set(name, value) - end + begin + klass = mod.const_get(class_name) + rescue NameError => e + raise FormulaUnavailableError, name, e.backtrace + else + FORMULAE[path] = klass end end - def self.unload_formula formula_name - Formulae.remove_formula_const(class_s(formula_name)) - end - - def self.restore_formula formula_name, value - old_verbose, $VERBOSE = $VERBOSE, nil - Formulae.formula_const_set(class_s(formula_name), value) - ensure - $VERBOSE = old_verbose - end - def self.class_s name class_name = name.capitalize class_name.gsub!(/[-_.\s]([a-zA-Z0-9])/) { $1.upcase } @@ -57,13 +40,10 @@ class Formulary attr_reader :name # The formula's ruby file's path or filename attr_reader :path - # The ruby constant name of the formula's class - attr_reader :class_name def initialize(name, path) @name = name @path = path.resolved_path - @class_name = Formulary.class_s(name) end # Gets the formula instance. @@ -72,16 +52,8 @@ class Formulary end def klass - begin - have_klass = Formulae.formula_const_defined?(class_name) - rescue NameError => e - raise unless e.name.to_s == class_name - raise FormulaUnavailableError, name, e.backtrace - end - - load_file unless have_klass - - Formulae.formula_const_get(class_name) + load_file unless Formulary.formula_class_defined?(path) + Formulary.formula_class_get(path) end private @@ -89,7 +61,7 @@ class Formulary def load_file STDERR.puts "#{$0} (#{self.class.name}): loading #{path}" if ARGV.debug? raise FormulaUnavailableError.new(name) unless path.file? - Formulae.module_eval(path.read, path) + Formulary.load_formula(name, path) end end