diff --git a/Library/Homebrew/formulary.rb b/Library/Homebrew/formulary.rb index dd67b4f243..b26846e006 100644 --- a/Library/Homebrew/formulary.rb +++ b/Library/Homebrew/formulary.rb @@ -20,6 +20,8 @@ module Formulary raise "Formula loading disabled by HOMEBREW_DISABLE_LOAD_FORMULA!" end + raise "Formula #{name} has already been loaded" if const_defined?(namespace) + mod = Module.new const_set(namespace, mod) begin diff --git a/Library/Homebrew/test/formulary_spec.rb b/Library/Homebrew/test/formulary_spec.rb index 234ebc93c3..7a7c8811af 100644 --- a/Library/Homebrew/test/formulary_spec.rb +++ b/Library/Homebrew/test/formulary_spec.rb @@ -27,6 +27,16 @@ describe Formulary do let(:bottle_dir) { Pathname.new("#{TEST_FIXTURE_DIR}/bottles") } let(:bottle) { bottle_dir/"testball_bottle-0.1.#{Utils::Bottles.tag}.bottle.tar.gz" } + describe "::load_formula" do + it "does not allow namespace repetition" do |example| + definition = "Foo = Class.new(Formula)" + namespace = "Test#{example.description.hash.abs}" + subject.load_formula("foo", "bar", definition, namespace) + expect { subject.load_formula("foo", "bar", definition, namespace) } + .to raise_error RuntimeError, /already.* loaded/ + end + end + describe "::class_s" do it "replaces '+' with 'x'" do expect(subject.class_s("foo++")).to eq("Fooxx")