aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJack Nagel2013-08-19 12:32:59 -0500
committerJack Nagel2013-08-19 12:32:59 -0500
commita1ce0dba1233f756a96abf15185dbccffe88ad3b (patch)
tree254ec95aba41d566f8b2e63cc164c572027c910a
parentc0f5d3aa014ee075d063f8c24f8e98ad722a33ce (diff)
downloadhomebrew-a1ce0dba1233f756a96abf15185dbccffe88ad3b.tar.bz2
More robust implementation of ENV.with_build_environment
-rw-r--r--Library/Homebrew/extend/ENV.rb11
-rw-r--r--Library/Homebrew/extend/ENV/shared.rb8
-rw-r--r--Library/Homebrew/test/test_ENV.rb57
3 files changed, 48 insertions, 28 deletions
diff --git a/Library/Homebrew/extend/ENV.rb b/Library/Homebrew/extend/ENV.rb
index 52404a1c8..7ae8ecc0d 100644
--- a/Library/Homebrew/extend/ENV.rb
+++ b/Library/Homebrew/extend/ENV.rb
@@ -18,6 +18,17 @@ module EnvActivation
extend(Stdenv)
end
end
+
+ def with_build_environment
+ old_env = to_hash.dup
+ tmp_env = to_hash.dup.extend(EnvActivation)
+ tmp_env.activate_extensions!
+ tmp_env.setup_build_environment
+ replace(tmp_env)
+ yield
+ ensure
+ replace(old_env)
+ end
end
ENV.extend(EnvActivation)
diff --git a/Library/Homebrew/extend/ENV/shared.rb b/Library/Homebrew/extend/ENV/shared.rb
index b8d17b2c3..0b5fee954 100644
--- a/Library/Homebrew/extend/ENV/shared.rb
+++ b/Library/Homebrew/extend/ENV/shared.rb
@@ -70,14 +70,6 @@ module SharedEnvExtension
prepend 'PATH', HOMEBREW_PREFIX/'bin', ':'
end
- def with_build_environment
- old_env = to_hash
- setup_build_environment
- yield
- ensure
- replace(old_env)
- end
-
def fortran
# superenv removes these PATHs, but this option needs them
# TODO fix better, probably by making a super-fc
diff --git a/Library/Homebrew/test/test_ENV.rb b/Library/Homebrew/test/test_ENV.rb
index 045909c33..45e81d43b 100644
--- a/Library/Homebrew/test/test_ENV.rb
+++ b/Library/Homebrew/test/test_ENV.rb
@@ -1,42 +1,59 @@
require 'testing_env'
+require 'extend/ENV'
class EnvironmentTests < Test::Unit::TestCase
+ def setup
+ @env = {}.extend(EnvActivation)
+ @env.activate_extensions!
+ end
+
def test_ENV_options
- ENV.gcc_4_0
- ENV.O3
- ENV.minimal_optimization
- ENV.no_optimization
- ENV.libxml2
- ENV.enable_warnings
- assert !ENV.cc.empty?
- assert !ENV.cxx.empty?
+ @env.gcc_4_0
+ @env.O3
+ @env.minimal_optimization
+ @env.no_optimization
+ @env.libxml2
+ @env.enable_warnings
+ assert !@env.cc.empty?
+ assert !@env.cxx.empty?
end
def test_switching_compilers
- ENV.llvm
- ENV.clang
- assert_nil ENV['LD']
- assert_equal ENV['OBJC'], ENV['CC']
+ @env.llvm
+ @env.clang
+ assert_nil @env['LD']
+ assert_equal @env['OBJC'], @env['CC']
end
def test_with_build_environment_restores_env
- before = ENV.to_hash
- ENV.with_build_environment do
- ENV['foo'] = 'bar'
+ before = @env.dup
+ @env.with_build_environment do
+ @env['foo'] = 'bar'
end
- assert_nil ENV['foo']
- assert_equal before, ENV.to_hash
+ assert_nil @env['foo']
+ assert_equal before, @env
end
def test_with_build_environment_ensures_env_restored
- ENV.expects(:replace).with(ENV.to_hash)
+ before = @env.dup
begin
- ENV.with_build_environment { raise Exception }
+ @env.with_build_environment do
+ @env['foo'] = 'bar'
+ raise Exception
+ end
rescue Exception
end
+ assert_nil @env['foo']
+ assert_equal before, @env
end
def test_with_build_environment_returns_block_value
- assert_equal 1, ENV.with_build_environment { 1 }
+ assert_equal 1, @env.with_build_environment { 1 }
+ end
+
+ def test_with_build_environment_does_not_mutate_interface
+ expected = @env.methods
+ @env.with_build_environment { assert_equal expected, @env.methods }
+ assert_equal expected, @env.methods
end
end