summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorevan <evan@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-07-21 06:30:40 +0000
committerevan <evan@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-07-21 06:30:40 +0000
commit6113a5add0a05eea33935fb9dd95a8c8e5c2755d (patch)
tree6e49919efd22c6414688df0880f261bfc048fc91
parent6e2850aa46b25d2f76fdd60c7466060f73994a85 (diff)
Load gems properly. Fixes [ruby-core:31377]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@28703 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--gem_prelude.rb23
-rw-r--r--lib/rubygems/custom_require.rb4
3 files changed, 26 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 17efacb077..1add9776e5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Wed Jul 21 15:22:17 2010 Evan Phoenix <evan@fallingsnow.net>
+
+ * lib/rubygems/custom_require.rb, gem_prelude.rb: Load code from
+ from gems properly.
+
Wed Jul 21 15:15:02 2010 NARUSE, Yui <naruse@ruby-lang.org>
* sprintf.c: add short documentation about named reference.
diff --git a/gem_prelude.rb b/gem_prelude.rb
index 700072b8ed..017adc2040 100644
--- a/gem_prelude.rb
+++ b/gem_prelude.rb
@@ -155,7 +155,7 @@ if defined?(Gem) then
end
def self.load_full_rubygems_library
- return if @loaded_full_rubygems_library
+ return false if @loaded_full_rubygems_library
remove
@@ -163,7 +163,10 @@ if defined?(Gem) then
if $".any? {|path| path.end_with?('/rubygems.rb')}
raise LoadError, "another rubygems is already loaded from #{path}"
end
+
require 'rubygems'
+
+ return true
end
def self.path_to_full_rubygems_library
@@ -200,11 +203,21 @@ if defined?(Gem) then
extend QuickLoader
def self.try_activate(path)
- # Just a stub to make sure rubygems is loaded
- QuickLoader.load_full_rubygems_library
+ # This method is only hit when the custom require is hit the first time.
+ # So we go off and dutifully load all of rubygems and retry the call
+ # to Gem.try_activate. We retry because full rubygems replaces this
+ # method with one that actually tries to find a gem for +path+ and load it.
+ #
+ # This is conditional because in the course of loading rubygems, the custom
+ # require will call back into here before all of rubygems is loaded. So
+ # we must not always retry the call. We only redo the call when
+ # load_full_rubygems_library returns true, which it only does the first
+ # time it's called.
+ #
+ if QuickLoader.load_full_rubygems_library
+ return Gem.try_activate(path)
+ end
- # But doesn't actually load anything, so that custom_require
- # can always call try_activate and get some decent response
return false
end
diff --git a/lib/rubygems/custom_require.rb b/lib/rubygems/custom_require.rb
index a410a3cfe0..480cb7e315 100644
--- a/lib/rubygems/custom_require.rb
+++ b/lib/rubygems/custom_require.rb
@@ -29,7 +29,9 @@ module Kernel
gem_original_require path
rescue LoadError => load_error
if load_error.message.end_with?(path)
- return true if Gem.try_activate(path)
+ if Gem.try_activate(path)
+ return gem_original_require(path)
+ end
end
raise load_error