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

ruby-changes:16277

From: naruse <ko1@a...>
Date: Thu, 10 Jun 2010 13:31:20 +0900 (JST)
Subject: [ruby-changes:16277] Ruby:r28245 (trunk): Revert r28200.

naruse	2010-06-10 13:31:08 +0900 (Thu, 10 Jun 2010)

  New Revision: 28245

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

  Log:
    Revert r28200.
    
    It caused many failures on test-all and following is SEGV.
    ./ruby -e 'require %!#{"foo/" * 10000}foo!'

  Removed files:
    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
  Modified files:
    trunk/gem_prelude.rb
    trunk/lib/rubygems/custom_require.rb
    trunk/lib/rubygems.rb

Index: gem_prelude.rb
===================================================================
--- gem_prelude.rb	(revision 28244)
+++ gem_prelude.rb	(revision 28245)
@@ -1,3 +1,4 @@
+# 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.
@@ -12,8 +13,7 @@
   module Kernel
 
     def gem(gem_name, *version_requirements)
-      Gem::QuickLoader.load_full_rubygems_library
-      gem gem_name, *version_requirements
+      Gem.push_gem_version_on_load_path(gem_name, *version_requirements)
     end
     private :gem
   end
@@ -133,27 +133,29 @@
     end
 
     module QuickLoader
+
+      @loaded_full_rubygems_library = false
+
       def self.load_full_rubygems_library
-        return @full_rubygems_library if defined?(@full_rubygems_library)
+        return if @loaded_full_rubygems_library
 
-        @full_rubygems_library = false
+        @loaded_full_rubygems_library = true
 
         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
@@ -175,6 +177,95 @@
         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
 
@@ -194,15 +285,10 @@
 
     extend QuickLoader
 
-    def self.try_activate(path) # :nodoc:
-      QuickLoader.load_full_rubygems_library
-    end
-
   end
 
   begin
-    require 'lib/rubygems/custom_require.rb'
-
+    Gem.push_all_highest_version_gems_on_load_path
     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 28244)
+++ lib/rubygems/custom_require.rb	(revision 28245)
@@ -4,6 +4,8 @@
 # See LICENSE.txt for permissions.
 #++
 
+require 'rubygems'
+
 module Kernel
 
   ##
@@ -29,17 +31,10 @@
     gem_original_require path
   rescue LoadError => load_error
     if load_error.message.end_with?(path) and
-        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
+       spec = Gem.searcher.find(path) then
+      Gem.activate(spec.name, "= #{spec.version}")
+      gem_original_require path
     else
-      load_error.backtrace.shift(2)
       raise load_error
     end
   end
@@ -47,5 +42,5 @@
   private :require
   private :gem_original_require
 
-end unless Kernel.private_method_defined?(:gem_original_require)
+end
 
Index: lib/rubygems.rb
===================================================================
--- lib/rubygems.rb	(revision 28244)
+++ lib/rubygems.rb	(revision 28245)
@@ -1020,6 +1020,8 @@
 
 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+.
   #
@@ -1096,34 +1098,13 @@
 
 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'
+require 'rubygems/custom_require' if gem_disabled or RUBY_VERSION < '1.9'
 
 Gem.clear_paths
 
Index: test/rubygems/gems/current/specifications/rubygems-bug-child-1.0.gemspec
===================================================================
--- test/rubygems/gems/current/specifications/rubygems-bug-child-1.0.gemspec	(revision 28244)
+++ test/rubygems/gems/current/specifications/rubygems-bug-child-1.0.gemspec	(revision 28245)
@@ -1,29 +0,0 @@
-# -*- 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
Index: test/rubygems/gems/current/specifications/rubygems-bug-child-1.1.gemspec
===================================================================
--- test/rubygems/gems/current/specifications/rubygems-bug-child-1.1.gemspec	(revision 28244)
+++ test/rubygems/gems/current/specifications/rubygems-bug-child-1.1.gemspec	(revision 28245)
@@ -1,29 +0,0 @@
-# -*- 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
Index: test/rubygems/gems/current/specifications/rubygems-bug-parent-1.0.gemspec
===================================================================
--- test/rubygems/gems/current/specifications/rubygems-bug-parent-1.0.gemspec	(revision 28244)
+++ test/rubygems/gems/current/specifications/rubygems-bug-parent-1.0.gemspec	(revision 28245)
@@ -1,32 +0,0 @@
-# -*- 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
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 28244)
+++ test/rubygems/gems/current/gems/rubygems-bug-child-1.0/lib/rubygems-bug-child.rb	(revision 28245)
@@ -1 +0,0 @@
-$bug_3140 = "1.0"
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 28244)
+++ test/rubygems/gems/current/gems/rubygems-bug-child-1.1/lib/rubygems-bug-child.rb	(revision 28245)
@@ -1 +0,0 @@
-$bug_3140 = "1.1"
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 28244)
+++ test/rubygems/gems/current/gems/rubygems-bug-parent-1.0/lib/rubygems-bug-parent.rb	(revision 28245)
@@ -1 +0,0 @@
-require "rubygems-bug-child"

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

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