[前][次][番号順一覧][スレッド一覧]

ruby-changes:16707

From: evan <ko1@a...>
Date: Wed, 21 Jul 2010 15:30:59 +0900 (JST)
Subject: [ruby-changes:16707] Ruby:r28703 (trunk): Load gems properly. Fixes

evan	2010-07-21 15:30:40 +0900 (Wed, 21 Jul 2010)

  New Revision: 28703

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=28703

  Log:
    Load gems properly. Fixes [ruby-core:31377]

  Modified files:
    trunk/ChangeLog
    trunk/gem_prelude.rb
    trunk/lib/rubygems/custom_require.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 28702)
+++ ChangeLog	(revision 28703)
@@ -1,3 +1,8 @@
+Wed Jul 21 15:22:17 2010  Evan Phoenix <evan@f...>
+
+	* lib/rubygems/custom_require.rb, gem_prelude.rb: Load code from
+		from gems properly.
+
 Wed Jul 21 15:15:02 2010  NARUSE, Yui  <naruse@r...>
 
 	* sprintf.c: add short documentation about named reference.
Index: gem_prelude.rb
===================================================================
--- gem_prelude.rb	(revision 28702)
+++ gem_prelude.rb	(revision 28703)
@@ -155,7 +155,7 @@
       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 $".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 @@
     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
 
Index: lib/rubygems/custom_require.rb
===================================================================
--- lib/rubygems/custom_require.rb	(revision 28702)
+++ lib/rubygems/custom_require.rb	(revision 28703)
@@ -29,7 +29,9 @@
     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

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]