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

ruby-changes:16234

From: nobu <ko1@a...>
Date: Tue, 8 Jun 2010 06:27:52 +0900 (JST)
Subject: [ruby-changes:16234] Ruby:r28200 (ruby_1_9_2, trunk): * gem_prelude.rb: load full rubygems at LoadError for activation

nobu	2010-06-08 06:27:16 +0900 (Tue, 08 Jun 2010)

  New Revision: 28200

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

  Log:
    * gem_prelude.rb: load full rubygems at LoadError for activation
      check.  [ruby-core:29486]

  Added directories:
    branches/ruby_1_9_2/test/rubygems/gems/
    branches/ruby_1_9_2/test/rubygems/gems/current/
    branches/ruby_1_9_2/test/rubygems/gems/current/gems/
    branches/ruby_1_9_2/test/rubygems/gems/current/gems/rubygems-bug-child-1.0/
    branches/ruby_1_9_2/test/rubygems/gems/current/gems/rubygems-bug-child-1.0/lib/
    branches/ruby_1_9_2/test/rubygems/gems/current/gems/rubygems-bug-child-1.1/
    branches/ruby_1_9_2/test/rubygems/gems/current/gems/rubygems-bug-child-1.1/lib/
    branches/ruby_1_9_2/test/rubygems/gems/current/gems/rubygems-bug-parent-1.0/
    branches/ruby_1_9_2/test/rubygems/gems/current/gems/rubygems-bug-parent-1.0/lib/
    branches/ruby_1_9_2/test/rubygems/gems/current/specifications/
    trunk/test/rubygems/gems/
    trunk/test/rubygems/gems/current/
    trunk/test/rubygems/gems/current/gems/
    trunk/test/rubygems/gems/current/gems/rubygems-bug-child-1.0/
    trunk/test/rubygems/gems/current/gems/rubygems-bug-child-1.0/lib/
    trunk/test/rubygems/gems/current/gems/rubygems-bug-child-1.1/
    trunk/test/rubygems/gems/current/gems/rubygems-bug-child-1.1/lib/
    trunk/test/rubygems/gems/current/gems/rubygems-bug-parent-1.0/
    trunk/test/rubygems/gems/current/gems/rubygems-bug-parent-1.0/lib/
    trunk/test/rubygems/gems/current/specifications/
  Added files:
    branches/ruby_1_9_2/test/rubygems/gems/current/gems/rubygems-bug-child-1.0/lib/rubygems-bug-child.rb
    branches/ruby_1_9_2/test/rubygems/gems/current/gems/rubygems-bug-child-1.1/lib/rubygems-bug-child.rb
    branches/ruby_1_9_2/test/rubygems/gems/current/gems/rubygems-bug-parent-1.0/lib/rubygems-bug-parent.rb
    branches/ruby_1_9_2/test/rubygems/gems/current/specifications/rubygems-bug-child-1.0.gemspec
    branches/ruby_1_9_2/test/rubygems/gems/current/specifications/rubygems-bug-child-1.1.gemspec
    branches/ruby_1_9_2/test/rubygems/gems/current/specifications/rubygems-bug-parent-1.0.gemspec
    branches/ruby_1_9_2/test/rubygems/test_gem_activation.rb
    trunk/test/rubygems/gems/current/gems/rubygems-bug-child-1.0/lib/rubygems-bug-child.rb
    trunk/test/rubygems/gems/current/gems/rubygems-bug-child-1.1/lib/rubygems-bug-child.rb
    trunk/test/rubygems/gems/current/gems/rubygems-bug-parent-1.0/lib/rubygems-bug-parent.rb
    trunk/test/rubygems/gems/current/specifications/rubygems-bug-child-1.0.gemspec
    trunk/test/rubygems/gems/current/specifications/rubygems-bug-child-1.1.gemspec
    trunk/test/rubygems/gems/current/specifications/rubygems-bug-parent-1.0.gemspec
    trunk/test/rubygems/test_gem_activation.rb
  Modified files:
    branches/ruby_1_9_2/ChangeLog
    branches/ruby_1_9_2/common.mk
    branches/ruby_1_9_2/gem_prelude.rb
    branches/ruby_1_9_2/lib/rubygems/custom_require.rb
    branches/ruby_1_9_2/lib/rubygems.rb
    trunk/ChangeLog
    trunk/common.mk
    trunk/gem_prelude.rb
    trunk/lib/rubygems/custom_require.rb
    trunk/lib/rubygems.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 28199)
+++ ChangeLog	(revision 28200)
@@ -1,3 +1,8 @@
+Tue Jun  8 06:27:09 2010  Nobuyoshi Nakada  <nobu@r...>
+
+	* gem_prelude.rb: load full rubygems at LoadError for activation
+	  check.  [ruby-core:29486]
+
 Tue Jun  8 06:04:49 2010  Nobuyoshi Nakada  <nobu@r...>
 
 	* io.c (parse_mode_enc): set set_by_bom bit.  [ruby-core:30641]
Index: gem_prelude.rb
===================================================================
--- gem_prelude.rb	(revision 28199)
+++ gem_prelude.rb	(revision 28200)
@@ -1,4 +1,3 @@
-# depends on: array.rb dir.rb env.rb file.rb hash.rb module.rb regexp.rb
 # vim: filetype=ruby
 
 # NOTICE: Ruby is during initialization here.
@@ -13,7 +12,8 @@
   module Kernel
 
     def gem(gem_name, *version_requirements)
-      Gem.push_gem_version_on_load_path(gem_name, *version_requirements)
+      Gem::QuickLoader.load_full_rubygems_library
+      gem gem_name, *version_requirements
     end
     private :gem
   end
@@ -133,29 +133,27 @@
     end
 
     module QuickLoader
-
-      @loaded_full_rubygems_library = false
-
       def self.load_full_rubygems_library
-        return if @loaded_full_rubygems_library
+        return @full_rubygems_library if defined?(@full_rubygems_library)
 
-        @loaded_full_rubygems_library = true
+        @full_rubygems_library = false
 
         class << Gem
           undef_method(*Gem::GEM_PRELUDE_METHODS)
-          undef_method :const_missing
-          undef_method :method_missing
         end
 
-        Kernel.module_eval do
-          undef_method :gem if method_defined? :gem
-        end
-
         $".delete path_to_full_rubygems_library
         if $".any? {|path| path.end_with?('/rubygems.rb')}
           raise LoadError, "another rubygems is already loaded from #{path}"
         end
+
+        verbose, debug = $VERBOSE, $DEBUG
+        $VERBOSE = $DEBUG = nil
+
         require 'rubygems'
+        @full_rubygems_library = true
+      ensure
+        $VERBOSE, $DEBUG = verbose, debug
       end
 
       def self.fake_rubygems_as_loaded
@@ -177,95 +175,6 @@
         end
       end
 
-      GemPaths = {}
-      GemVersions = {}
-
-      def push_gem_version_on_load_path(gem_name, *version_requirements)
-        if version_requirements.empty?
-          unless GemPaths.has_key?(gem_name) then
-            raise Gem::LoadError, "Could not find RubyGem #{gem_name} (>= 0)\n"
-          end
-
-          # highest version gems already active
-          return false
-        else
-          if version_requirements.length > 1 then
-            QuickLoader.load_full_rubygems_library
-            return gem(gem_name, *version_requirements)
-          end
-
-          requirement, version = version_requirements[0].split
-          requirement.strip!
-
-          if loaded_version = GemVersions[gem_name] then
-            case requirement
-            when ">", ">=" then
-              return false if
-                (loaded_version <=> Gem.integers_for(version)) >= 0
-            when "~>" then
-              required_version = Gem.integers_for version
-
-              return false if loaded_version.first == required_version.first
-            end
-          end
-
-          QuickLoader.load_full_rubygems_library
-          gem gem_name, *version_requirements
-        end
-      end
-
-      def integers_for(gem_version)
-        numbers = gem_version.split(".").collect {|n| n.to_i}
-        numbers.pop while numbers.last == 0
-        numbers << 0 if numbers.empty?
-        numbers
-      end
-
-      def push_all_highest_version_gems_on_load_path
-        Gem.path.each do |path|
-          gems_directory = File.join(path, "gems")
-
-          if File.exist?(gems_directory) then
-            Dir.entries(gems_directory).each do |gem_directory_name|
-              next if gem_directory_name == "." || gem_directory_name == ".."
-
-              next unless gem_name = gem_directory_name[/(.*)-(.*)/, 1]
-              new_version = integers_for($2)
-              current_version = GemVersions[gem_name]
-
-              if !current_version or (current_version <=> new_version) < 0 then
-                GemVersions[gem_name] = new_version
-                GemPaths[gem_name] = File.join(gems_directory, gem_directory_name)
-              end
-            end
-          end
-        end
-
-        require_paths = []
-
-        GemPaths.each_value do |path|
-          if File.exist?(file = File.join(path, ".require_paths")) then
-            paths = File.read(file).split.map do |require_path|
-              File.join path, require_path
-            end
-
-            require_paths.concat paths
-          else
-            require_paths << file if File.exist?(file = File.join(path, "bin"))
-            require_paths << file if File.exist?(file = File.join(path, "lib"))
-          end
-        end
-
-        # "tag" the first require_path inserted into the $LOAD_PATH to enable
-        # indexing correctly with rubygems proper when it inserts an explicitly
-        # gem version
-        unless require_paths.empty? then
-          require_paths.first.instance_variable_set(:@gem_prelude_index, true)
-        end
-        # gem directories must come after -I and ENV['RUBYLIB']
-        $:[$:.index{|e|e.instance_variable_defined?(:@gem_prelude_index)}||-1,0] = require_paths
-      end
-
       def const_missing(constant)
         QuickLoader.load_full_rubygems_library
 
@@ -285,10 +194,15 @@
 
     extend QuickLoader
 
+    def self.try_activate(path) # :nodoc:
+      QuickLoader.load_full_rubygems_library
+    end
+
   end
 
   begin
-    Gem.push_all_highest_version_gems_on_load_path
+    require 'lib/rubygems/custom_require.rb'
+
     Gem::QuickLoader.fake_rubygems_as_loaded
   rescue Exception => e
     puts "Error loading gem paths on load path in gem_prelude"
Index: lib/rubygems/custom_require.rb
===================================================================
--- lib/rubygems/custom_require.rb	(revision 28199)
+++ lib/rubygems/custom_require.rb	(revision 28200)
@@ -4,8 +4,6 @@
 # See LICENSE.txt for permissions.
 #++
 
-require 'rubygems'
-
 module Kernel
 
   ##
@@ -31,10 +29,17 @@
     gem_original_require path
   rescue LoadError => load_error
     if load_error.message.end_with?(path) and
-       spec = Gem.searcher.find(path) then
-      Gem.activate(spec.name, "= #{spec.version}")
-      gem_original_require path
+        begin
+          Gem.try_activate(path)
+        rescue Gem::LoadError => load_error
+          pat = "#{__FILE__}:#{__LINE__-2}:in "
+          bt = load_error.backtrace
+          num = bt.index {|e| e.start_with?(pat)} and bt.shift(num+2)
+          raise load_error
+        end
+      retry
     else
+      load_error.backtrace.shift(2)
       raise load_error
     end
   end
@@ -42,5 +47,5 @@
   private :require
   private :gem_original_require
 
-end
+end unless Kernel.private_method_defined?(:gem_original_require)
 
Index: lib/rubygems.rb
===================================================================
--- lib/rubygems.rb	(revision 28199)
+++ lib/rubygems.rb	(revision 28200)
@@ -1020,8 +1020,6 @@
 
 module Kernel
 
-  undef gem if respond_to? :gem # defined in gem_prelude.rb on 1.9
-
   ##
   # Use Kernel#gem to activate a specific version of +gem_name+.
   #
@@ -1098,13 +1096,34 @@
 
 require 'rubygems/config_file'
 
+class << Gem
+  verbose, debug = $VERBOSE, $DEBUG
+  $VERBOSE = $DEBUG = nil
+
+  ##
+  #
+  # Called from the custom_require to attempt to activate +path+
+  # Internal use only.
+
+  def try_activate(path) # :doc:
+    spec = Gem.searcher.find(path)
+    return false unless spec
+
+    Gem.activate(spec.name, "= #{spec.version}")
+    return true
+  end
+
+ensure
+  $VERBOSE, $DEBUG = verbose, debug
+end
+
 ##
 # Enables the require hook for RubyGems.
 #
 # Ruby 1.9 allows --disable-gems, so we require it when we didn't detect a Gem
 # constant at rubygems.rb load time.
 
-require 'rubygems/custom_require' if gem_disabled or RUBY_VERSION < '1.9'
+require 'rubygems/custom_require'
 
 Gem.clear_paths
 
Index: common.mk
===================================================================
--- common.mk	(revision 28199)
+++ common.mk	(revision 28200)
@@ -734,7 +734,9 @@
 miniprelude.c: $(srcdir)/tool/compile_prelude.rb $(srcdir)/prelude.rb
 	$(BASERUBY) -I$(srcdir) $(srcdir)/tool/compile_prelude.rb $(srcdir)/prelude.rb $@
 
-prelude.c: $(srcdir)/tool/compile_prelude.rb $(RBCONFIG) $(srcdir)/lib/rubygems/defaults.rb $(PRELUDE_SCRIPTS) $(PREP)
+prelude.c: $(srcdir)/tool/compile_prelude.rb $(RBCONFIG) \
+	   $(srcdir)/lib/rubygems/defaults.rb $(srcdir)/lib/rubygems/custom_require.rb \
+	   $(PRELUDE_SCRIPTS) $(PREP)
 	$(COMPILE_PRELUDE) $(PRELUDE_SCRIPTS) $@
 
 golf_prelude.c: $(srcdir)/tool/compile_prelude.rb $(RBCONFIG) $(srcdir)/prelude.rb $(srcdir)/golf_prelude.rb $(PREP)
Index: test/rubygems/test_gem_activation.rb
===================================================================
--- test/rubygems/test_gem_activation.rb	(revision 0)
+++ test/rubygems/test_gem_activation.rb	(revision 28200)
@@ -0,0 +1,20 @@
+require_relative '../ruby/envutil'
+require 'test/unit'
+
+class TestGemActivation < Test::Unit::TestCase
+  def test_activation
+    bug3140 = '[ruby-core:29486]'
+    src = %{begin
+  require 'rubygems-bug-parent'
+rescue Gem::LoadError
+  puts $!
+else
+  puts $bug_3140
+end}
+    basedir = File.expand_path("../gems/current", __FILE__)
+    env = {"HOME"=>basedir, "GEM_HOME"=>basedir, "GEM_PATH"=>basedir}
+    assert_in_out_err([env, "-rrubygems-bug-child", "-e", src], "",
+                      /can't activate rubygems-bug-child.*already activated rubygems-bug-child-1\.1/, [],
+                      $bug_3140)
+  end
+end if defined?(::Gem)

Property changes on: test/rubygems/test_gem_activation.rb
___________________________________________________________________
Name: svn:eol-style
   + LF

Index: test/rubygems/gems/current/specifications/rubygems-bug-child-1.0.gemspec
===================================================================
--- test/rubygems/gems/current/specifications/rubygems-bug-child-1.0.gemspec	(revision 0)
+++ test/rubygems/gems/current/specifications/rubygems-bug-child-1.0.gemspec	(revision 28200)
@@ -0,0 +1,29 @@
+# -*- encoding: utf-8 -*-
+
+Gem::Specification.new do |s|
+  s.name = %q{rubygems-bug-child}
+  s.version = "1.0"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
+  s.authors = ["Yehuda Katz"]
+  s.date = %q{2010-04-12}
+  s.description = %q{Demonstrates a rubygems bug that exists in 1.9 because of gem prelude but not 1.8}
+  s.email = %q{wycats@g...}
+  s.files = ["lib/rubygems-bug-child.rb"]
+  s.homepage = %q{http://www.yehudakatz.com}
+  s.require_paths = ["lib"]
+  s.required_ruby_version = Gem::Requirement.new(">= 1.8.7")
+  s.rubyforge_project = %q{rubygems-bug}
+  s.rubygems_version = %q{1.3.6}
+  s.summary = %q{Demonstrates a rubygems bug}
+
+  if s.respond_to? :specification_version then
+    current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
+    s.specification_version = 3
+
+    if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
+    else
+    end
+  else
+  end
+end

Property changes on: test/rubygems/gems/current/specifications/rubygems-bug-child-1.0.gemspec
___________________________________________________________________
Name: svn:eol-style
   + LF

Index: test/rubygems/gems/current/specifications/rubygems-bug-child-1.1.gemspec
===================================================================
--- test/rubygems/gems/current/specifications/rubygems-bug-child-1.1.gemspec	(revision 0)
+++ test/rubygems/gems/current/specifications/rubygems-bug-child-1.1.gemspec	(revision 28200)
@@ -0,0 +1,29 @@
+# -*- encoding: utf-8 -*-
+
+Gem::Specification.new do |s|
+  s.name = %q{rubygems-bug-child}
+  s.version = "1.1"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
+  s.authors = ["Yehuda Katz"]
+  s.date = %q{2010-04-12}
+  s.description = %q{Demonstrates a rubygems bug that exists in 1.9 because of gem prelude but not 1.8}
+  s.email = %q{wycats@g...}
+  s.files = ["lib/rubygems-bug-child.rb"]
+  s.homepage = %q{http://www.yehudakatz.com}
+  s.require_paths = ["lib"]
+  s.required_ruby_version = Gem::Requirement.new(">= 1.8.7")
+  s.rubyforge_project = %q{rubygems-bug}
+  s.rubygems_version = %q{1.3.6}
+  s.summary = %q{Demonstrates a rubygems bug}
+
+  if s.respond_to? :specification_version then
+    current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
+    s.specification_version = 3
+
+    if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
+    else
+    end
+  else
+  end
+end

Property changes on: test/rubygems/gems/current/specifications/rubygems-bug-child-1.1.gemspec
___________________________________________________________________
Name: svn:eol-style
   + LF

Index: test/rubygems/gems/current/specifications/rubygems-bug-parent-1.0.gemspec
===================================================================
--- test/rubygems/gems/current/specifications/rubygems-bug-parent-1.0.gemspec	(revision 0)
+++ test/rubygems/gems/current/specifications/rubygems-bug-parent-1.0.gemspec	(revision 28200)
@@ -0,0 +1,32 @@
+# -*- encoding: utf-8 -*-
+
+Gem::Specification.new do |s|
+  s.name = %q{rubygems-bug-parent}
+  s.version = "1.0"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
+  s.authors = ["Yehuda Katz"]
+  s.date = %q{2010-04-12}
+  s.description = %q{Demonstrates a rubygems bug that exists in 1.9 because of gem prelude but not 1.8}
+  s.email = %q{wycats@g...}
+  s.files = ["lib/rubygems-bug-parent.rb"]
+  s.homepage = %q{http://www.yehudakatz.com}
+  s.require_paths = ["lib"]
+  s.required_ruby_version = Gem::Requirement.new(">= 1.8.7")
+  s.rubyforge_project = %q{rubygems-bug}
+  s.rubygems_version = %q{1.3.6}
+  s.summary = %q{Demonstrates a rubygems bug}
+
+  if s.respond_to? :specification_version then
+    current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
+    s.specification_version = 3
+
+    if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
+      s.add_runtime_dependency(%q<rubygems-bug-child>, ["= 1.0.0"])
+    else
+      s.add_dependency(%q<rubygems-bug-child>, ["= 1.0.0"])
+    end
+  else
+    s.add_dependency(%q<rubygems-bug-child>, ["= 1.0.0"])
+  end
+end

Property changes on: test/rubygems/gems/current/specifications/rubygems-bug-parent-1.0.gemspec
___________________________________________________________________
Name: svn:eol-style
   + LF

Index: test/rubygems/gems/current/gems/rubygems-bug-child-1.0/lib/rubygems-bug-child.rb
===================================================================
--- test/rubygems/gems/current/gems/rubygems-bug-child-1.0/lib/rubygems-bug-child.rb	(revision 0)
+++ test/rubygems/gems/current/gems/rubygems-bug-child-1.0/lib/rubygems-bug-child.rb	(revision 28200)
@@ -0,0 +1 @@
+$bug_3140 = "1.0"

Property changes on: test/rubygems/gems/current/gems/rubygems-bug-child-1.0/lib/rubygems-bug-child.rb
___________________________________________________________________
Name: svn:eol-style
   + LF

Index: test/rubygems/gems/current/gems/rubygems-bug-child-1.1/lib/rubygems-bug-child.rb
===================================================================
--- test/rubygems/gems/current/gems/rubygems-bug-child-1.1/lib/rubygems-bug-child.rb	(revision 0)
+++ test/rubygems/gems/current/gems/rubygems-bug-child-1.1/lib/rubygems-bug-child.rb	(revision 28200)
@@ -0,0 +1 @@
+$bug_3140 = "1.1"

Property changes on: test/rubygems/gems/current/gems/rubygems-bug-child-1.1/lib/rubygems-bug-child.rb
___________________________________________________________________
Name: svn:eol-style
   + LF

Index: test/rubygems/gems/current/gems/rubygems-bug-parent-1.0/lib/rubygems-bug-parent.rb
===================================================================
--- test/rubygems/gems/current/gems/rubygems-bug-parent-1.0/lib/rubygems-bug-parent.rb	(revision 0)
+++ test/rubygems/gems/current/gems/rubygems-bug-parent-1.0/lib/rubygems-bug-parent.rb	(revision 28200)
@@ -0,0 +1 @@
+require "rubygems-bug-child"

Property changes on: test/rubygems/gems/current/gems/rubygems-bug-parent-1.0/lib/rubygems-bug-parent.rb
___________________________________________________________________
Name: svn:eol-style
   + LF

Index: ruby_1_9_2/ChangeLog
===================================================================
--- ruby_1_9_2/ChangeLog	(revision 28199)
+++ ruby_1_9_2/ChangeLog	(revision 28200)
@@ -1,3 +1,8 @@
+Tue Jun  8 06:27:09 2010  Nobuyoshi Nakada  <nobu@r...>
+
+	* gem_prelude.rb: load full rubygems at LoadError for activation
+	  check.  [ruby-core:29486]
+
 Tue Jun  8 06:04:49 2010  Nobuyoshi Nakada  <nobu@r...>
 
 	* io.c (parse_mode_enc): set set_by_bom bit.  [ruby-core:30641]
Index: ruby_1_9_2/gem_prelude.rb
===================================================================
--- ruby_1_9_2/gem_prelude.rb	(revision 28199)
+++ ruby_1_9_2/gem_prelude.rb	(revision 28200)
@@ -1,4 +1,3 @@
-# depends on: array.rb dir.rb env.rb file.rb hash.rb module.rb regexp.rb
 # vim: filetype=ruby
 
 # NOTICE: Ruby is during initialization here.
@@ -13,7 +12,8 @@
   module Kernel
 
     def gem(gem_name, *version_requirements)
-      Gem.push_gem_version_on_load_path(gem_name, *version_requirements)
+      Gem::QuickLoader.load_full_rubygems_library
+      gem gem_name, *version_requirements
     end
     private :gem
   end
@@ -133,29 +133,27 @@
     end
 
     module QuickLoader
-
-      @loaded_full_rubygems_library = false
-
       def self.load_full_rubygems_library
-        return if @loaded_full_rubygems_library
+        return @full_rubygems_library if defined?(@full_rubygems_library)
 
-        @loaded_full_rubygems_library = true
+        @full_rubygems_library = false
 
         class << Gem
           undef_method(*Gem::GEM_PRELUDE_METHODS)
-          undef_method :const_missing
-          undef_method :method_missing
         end
 
-        Kernel.module_eval do
-          undef_method :gem if method_defined? :gem
-        end
-
         $".delete path_to_full_rubygems_library
         if $".any? {|path| path.end_with?('/rubygems.rb')}
           raise LoadError, "another rubygems is already loaded from #{path}"
         end
+
+        verbose, debug = $VERBOSE, $DEBUG
+        $VERBOSE = $DEBUG = nil
+
         require 'rubygems'
+        @full_rubygems_library = true
+      ensure
+        $VERBOSE, $DEBUG = verbose, debug
       end
 
       def self.fake_rubygems_as_loaded
@@ -177,95 +175,6 @@
         end
       end
 
-      GemPaths = {}
-      GemVersions = {}
-
-      def push_gem_version_on_load_path(gem_name, *version_requirements)
-        if version_requirements.empty?
-          unless GemPaths.has_key?(gem_name) then
-            raise Gem::LoadError, "Could not find RubyGem #{gem_name} (>= 0)\n"
-          end
-
-          # highest version gems already active
-          return false
-        else
-          if version_requirements.length > 1 then
-            QuickLoader.load_full_rubygems_library
-            return gem(gem_name, *version_requirements)
-          end
-
-          requirement, version = version_requirements[0].split
-          requirement.strip!
-
-          if loaded_version = GemVersions[gem_name] then
-            case requirement
-            when ">", ">=" then
-              return false if
-                (loaded_version <=> Gem.integers_for(version)) >= 0
-            when "~>" then
-              required_version = Gem.integers_for version
-
-              return false if loaded_version.first == required_version.first
-            end
-          end
-
-          QuickLoader.load_full_rubygems_library
-          gem gem_name, *version_requirements
-        end
-      end
-
-      def integers_for(gem_version)
-        numbers = gem_version.split(".").collect {|n| n.to_i}
-        numbers.pop while numbers.last == 0
-        numbers << 0 if numbers.empty?
-        numbers
-      end
-
-      def push_all_highest_version_gems_on_load_path
-        Gem.path.each do |path|
-          gems_directory = File.join(path, "gems")
-
-          if File.exist?(gems_directory) then
-            Dir.entries(gems_directory).each do |gem_directory_name|
-              next if gem_directory_name == "." || gem_directory_name == ".."
-
-              next unless gem_name = gem_directory_name[/(.*)-(.*)/, 1]
-              new_version = integers_for($2)
-              current_version = GemVersions[gem_name]
-
-              if !current_version or (current_version <=> new_version) < 0 then
-                GemVersions[gem_name] = new_version
-                GemPaths[gem_name] = File.join(gems_directory, gem_directory_name)
-              end
-            end
-          end
-        end
-
-        require_paths = []
-
-        GemPaths.each_value do |path|
-          if File.exist?(file = File.join(path, ".require_paths")) then
-            paths = File.read(file).split.map do |require_path|
-              File.join path, require_path
-            end
-
-            require_paths.concat paths
-          else
-            require_paths << file if File.exist?(file = File.join(path, "bin"))
-            require_paths << file if File.exist?(file = File.join(path, "lib"))
-          end
-        end
-
-        # "tag" the first require_path inserted into the $LOAD_PATH to enable
-        # indexing correctly with rubygems proper when it inserts an explicitly
-        # gem version
-        unless require_paths.empty? then
-          require_paths.first.instance_variable_set(:@gem_prelude_index, true)
-        end
-        # gem directories must come after -I and ENV['RUBYLIB']
-        $:[$:.index{|e|e.instance_variable_defined?(:@gem_prelude_index)}||-1,0] = require_paths
-      end
-
       def const_missing(constant)
         QuickLoader.load_full_rubygems_library
 
@@ -285,10 +194,15 @@
 
     extend QuickLoader
 
+    def self.try_activate(path) # :nodoc:
+      QuickLoader.load_full_rubygems_library
+    end
+
   end
 
   begin
-    Gem.push_all_highest_version_gems_on_load_path
+    require 'lib/rubygems/custom_require.rb'
+
     Gem::QuickLoader.fake_rubygems_as_loaded
   rescue Exception => e
     puts "Error loading gem paths on load path in gem_prelude"
Index: ruby_1_9_2/lib/rubygems/custom_require.rb
===================================================================
--- ruby_1_9_2/lib/rubygems/custom_require.rb	(revision 28199)
+++ ruby_1_9_2/lib/rubygems/custom_require.rb	(revision 28200)
@@ -4,8 +4,6 @@
 # See LICENSE.txt for permissions.
 #++
 
-require 'rubygems'
-
 module Kernel
 
   ##
@@ -31,10 +29,17 @@
     gem_original_require path
   rescue LoadError => load_error
     if load_error.message.end_with?(path) and
-       spec = Gem.searcher.find(path) then
-      Gem.activate(spec.name, "= #{spec.version}")
-      gem_original_require path
+        begin
+          Gem.try_activate(path)
+        rescue Gem::LoadError => load_error
+          pat = "#{__FILE__}:#{__LINE__-2}:in "
+          bt = load_error.backtrace
+          num = bt.index {|e| e.start_with?(pat)} and bt.shift(num+2)
+          raise load_error
+        end
+      retry
     else
+      load_error.backtrace.shift(2)
       raise load_error
     end
   end
@@ -42,5 +47,5 @@
   private :require
   private :gem_original_require
 
-end
+end unless Kernel.private_method_defined?(:gem_original_require)
 
Index: ruby_1_9_2/lib/rubygems.rb
===================================================================
--- ruby_1_9_2/lib/rubygems.rb	(revision 28199)
+++ ruby_1_9_2/lib/rubygems.rb	(revision 28200)
@@ -1020,8 +1020,6 @@
 
 module Kernel
 
-  undef gem if respond_to? :gem # defined in gem_prelude.rb on 1.9
-
   ##
   # Use Kernel#gem to activate a specific version of +gem_name+.
   #
@@ -1098,13 +1096,34 @@
 
 require 'rubygems/config_file'
 
+class << Gem
+  verbose, debug = $VERBOSE, $DEBUG
+  $VERBOSE = $DEBUG = nil
+
+  ##
+  #
+  # Called from the custom_require to attempt to activate +path+
+  # Internal use only.
+
+  def try_activate(path) # :doc:
+    spec = Gem.searcher.find(path)
+    return false unless spec
+
+    Gem.activate(spec.name, "= #{spec.version}")
+    return true
+  end
+
+ensure
+  $VERBOSE, $DEBUG = verbose, debug
+end
+
 ##
 # Enables the require hook for RubyGems.
 #
 # Ruby 1.9 allows --disable-gems, so we require it when we didn't detect a Gem
 # constant at rubygems.rb load time.
 
-require 'rubygems/custom_require' if gem_disabled or RUBY_VERSION < '1.9'
+require 'rubygems/custom_require'
 
 Gem.clear_paths
 
Index: ruby_1_9_2/common.mk
===================================================================
--- ruby_1_9_2/common.mk	(revision 28199)
+++ ruby_1_9_2/common.mk	(revision 28200)
@@ -736,7 +736,9 @@
 miniprelude.c: $(srcdir)/tool/compile_prelude.rb $(srcdir)/prelude.rb
 	$(BASERUBY) -I$(srcdir) $(srcdir)/tool/compile_prelude.rb $(srcdir)/prelude.rb $@
 
-prelude.c: $(srcdir)/tool/compile_prelude.rb $(RBCONFIG) $(srcdir)/lib/rubygems/defaults.rb $(PRELUDE_SCRIPTS) $(PREP)
+prelude.c: $(srcdir)/tool/compile_prelude.rb $(RBCONFIG) \
+	   $(srcdir)/lib/rubygems/defaults.rb $(srcdir)/lib/rubygems/custom_require.rb \
+	   $(PRELUDE_SCRIPTS) $(PREP)
 	$(COMPILE_PRELUDE) $(PRELUDE_SCRIPTS) $@
 
 golf_prelude.c: $(srcdir)/tool/compile_prelude.rb $(RBCONFIG) $(srcdir)/prelude.rb $(srcdir)/golf_prelude.rb $(PREP)
Index: ruby_1_9_2/test/rubygems/test_gem_activation.rb
===================================================================
--- ruby_1_9_2/test/rubygems/test_gem_activation.rb	(revision 0)
+++ ruby_1_9_2/test/rubygems/test_gem_activation.rb	(revision 28200)
@@ -0,0 +1,20 @@
+require_relative '../ruby/envutil'
+require 'test/unit'
+
+class TestGemActivation < Test::Unit::TestCase
+  def test_activation
+    bug3140 = '[ruby-core:29486]'
+    src = %{begin
+  require 'rubygems-bug-parent'
+rescue Gem::LoadError
+  puts $!
+else
+  puts $bug_3140
+end}
+    basedir = File.expand_path("../gems/current", __FILE__)
+    env = {"HOME"=>basedir, "GEM_HOME"=>basedir, "GEM_PATH"=>basedir}
+    assert_in_out_err([env, "-rrubygems-bug-child", "-e", src], "",
+                      /can't activate rubygems-bug-child.*already activated rubygems-bug-child-1\.1/, [],
+                      $bug_3140)
+  end
+end if defined?(::Gem)

Property changes on: ruby_1_9_2/test/rubygems/test_gem_activation.rb
___________________________________________________________________
Name: svn:eol-style
   + LF

Index: ruby_1_9_2/test/rubygems/gems/current/specifications/rubygems-bug-child-1.0.gemspec
===================================================================
--- ruby_1_9_2/test/rubygems/gems/current/specifications/rubygems-bug-child-1.0.gemspec	(revision 0)
+++ ruby_1_9_2/test/rubygems/gems/current/specifications/rubygems-bug-child-1.0.gemspec	(revision 28200)
@@ -0,0 +1,29 @@
+# -*- encoding: utf-8 -*-
+
+Gem::Specification.new do |s|
+  s.name = %q{rubygems-bug-child}
+  s.version = "1.0"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
+  s.authors = ["Yehuda Katz"]
+  s.date = %q{2010-04-12}
+  s.description = %q{Demonstrates a rubygems bug that exists in 1.9 because of gem prelude but not 1.8}
+  s.email = %q{wycats@g...}
+  s.files = ["lib/rubygems-bug-child.rb"]
+  s.homepage = %q{http://www.yehudakatz.com}
+  s.require_paths = ["lib"]
+  s.required_ruby_version = Gem::Requirement.new(">= 1.8.7")
+  s.rubyforge_project = %q{rubygems-bug}
+  s.rubygems_version = %q{1.3.6}
+  s.summary = %q{Demonstrates a rubygems bug}
+
+  if s.respond_to? :specification_version then
+    current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
+    s.specification_version = 3
+
+    if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
+    else
+    end
+  else
+  end
+end

Property changes on: ruby_1_9_2/test/rubygems/gems/current/specifications/rubygems-bug-child-1.0.gemspec
___________________________________________________________________
Name: svn:eol-style
   + LF

Index: ruby_1_9_2/test/rubygems/gems/current/specifications/rubygems-bug-child-1.1.gemspec
===================================================================
--- ruby_1_9_2/test/rubygems/gems/current/specifications/rubygems-bug-child-1.1.gemspec	(revision 0)
+++ ruby_1_9_2/test/rubygems/gems/current/specifications/rubygems-bug-child-1.1.gemspec	(revision 28200)
@@ -0,0 +1,29 @@
+# -*- encoding: utf-8 -*-
+
+Gem::Specification.new do |s|
+  s.name = %q{rubygems-bug-child}
+  s.version = "1.1"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
+  s.authors = ["Yehuda Katz"]
+  s.date = %q{2010-04-12}
+  s.description = %q{Demonstrates a rubygems bug that exists in 1.9 because of gem prelude but not 1.8}
+  s.email = %q{wycats@g...}
+  s.files = ["lib/rubygems-bug-child.rb"]
+  s.homepage = %q{http://www.yehudakatz.com}
+  s.require_paths = ["lib"]
+  s.required_ruby_version = Gem::Requirement.new(">= 1.8.7")
+  s.rubyforge_project = %q{rubygems-bug}
+  s.rubygems_version = %q{1.3.6}
+  s.summary = %q{Demonstrates a rubygems bug}
+
+  if s.respond_to? :specification_version then
+    current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
+    s.specification_version = 3
+
+    if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
+    else
+    end
+  else
+  end
+end

Property changes on: ruby_1_9_2/test/rubygems/gems/current/specifications/rubygems-bug-child-1.1.gemspec
___________________________________________________________________
Name: svn:eol-style
   + LF

Index: ruby_1_9_2/test/rubygems/gems/current/specifications/rubygems-bug-parent-1.0.gemspec
===================================================================
--- ruby_1_9_2/test/rubygems/gems/current/specifications/rubygems-bug-parent-1.0.gemspec	(revision 0)
+++ ruby_1_9_2/test/rubygems/gems/current/specifications/rubygems-bug-parent-1.0.gemspec	(revision 28200)
@@ -0,0 +1,32 @@
+# -*- encoding: utf-8 -*-
+
+Gem::Specification.new do |s|
+  s.name = %q{rubygems-bug-parent}
+  s.version = "1.0"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
+  s.authors = ["Yehuda Katz"]
+  s.date = %q{2010-04-12}
+  s.description = %q{Demonstrates a rubygems bug that exists in 1.9 because of gem prelude but not 1.8}
+  s.email = %q{wycats@g...}
+  s.files = ["lib/rubygems-bug-parent.rb"]
+  s.homepage = %q{http://www.yehudakatz.com}
+  s.require_paths = ["lib"]
+  s.required_ruby_version = Gem::Requirement.new(">= 1.8.7")
+  s.rubyforge_project = %q{rubygems-bug}
+  s.rubygems_version = %q{1.3.6}
+  s.summary = %q{Demonstrates a rubygems bug}
+
+  if s.respond_to? :specification_version then
+    current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
+    s.specification_version = 3
+
+    if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
+      s.add_runtime_dependency(%q<rubygems-bug-child>, ["= 1.0.0"])
+    else
+      s.add_dependency(%q<rubygems-bug-child>, ["= 1.0.0"])
+    end
+  else
+    s.add_dependency(%q<rubygems-bug-child>, ["= 1.0.0"])
+  end
+end

Property changes on: ruby_1_9_2/test/rubygems/gems/current/specifications/rubygems-bug-parent-1.0.gemspec
___________________________________________________________________
Name: svn:eol-style
   + LF

Index: ruby_1_9_2/test/rubygems/gems/current/gems/rubygems-bug-child-1.0/lib/rubygems-bug-child.rb
===================================================================
--- ruby_1_9_2/test/rubygems/gems/current/gems/rubygems-bug-child-1.0/lib/rubygems-bug-child.rb	(revision 0)
+++ ruby_1_9_2/test/rubygems/gems/current/gems/rubygems-bug-child-1.0/lib/rubygems-bug-child.rb	(revision 28200)
@@ -0,0 +1 @@
+$bug_3140 = "1.0"

Property changes on: ruby_1_9_2/test/rubygems/gems/current/gems/rubygems-bug-child-1.0/lib/rubygems-bug-child.rb
___________________________________________________________________
Name: svn:eol-style
   + LF

Index: ruby_1_9_2/test/rubygems/gems/current/gems/rubygems-bug-child-1.1/lib/rubygems-bug-child.rb
===================================================================
--- ruby_1_9_2/test/rubygems/gems/current/gems/rubygems-bug-child-1.1/lib/rubygems-bug-child.rb	(revision 0)
+++ ruby_1_9_2/test/rubygems/gems/current/gems/rubygems-bug-child-1.1/lib/rubygems-bug-child.rb	(revision 28200)
@@ -0,0 +1 @@
+$bug_3140 = "1.1"

Property changes on: ruby_1_9_2/test/rubygems/gems/current/gems/rubygems-bug-child-1.1/lib/rubygems-bug-child.rb
___________________________________________________________________
Name: svn:eol-style
   + LF

Index: ruby_1_9_2/test/rubygems/gems/current/gems/rubygems-bug-parent-1.0/lib/rubygems-bug-parent.rb
===================================================================
--- ruby_1_9_2/test/rubygems/gems/current/gems/rubygems-bug-parent-1.0/lib/rubygems-bug-parent.rb	(revision 0)
+++ ruby_1_9_2/test/rubygems/gems/current/gems/rubygems-bug-parent-1.0/lib/rubygems-bug-parent.rb	(revision 28200)
@@ -0,0 +1 @@
+require "rubygems-bug-child"

Property changes on: ruby_1_9_2/test/rubygems/gems/current/gems/rubygems-bug-parent-1.0/lib/rubygems-bug-parent.rb
___________________________________________________________________
Name: svn:eol-style
   + LF


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

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