[DRE-maint] Bug#588125: Rubygems 1.3.7 broken with Ruby 1.9.2 in Debian -- help needed

akira yamada akira at debian.org
Wed Aug 25 23:25:28 UTC 2010


2010/8/26 Lucas Nussbaum <lucas at lucas-nussbaum.net>:
> That worked fine until Ruby 1.9.1, but apparently a change in Ruby
> 1.9.2 broke Rubygems 1.3.7. This is exhibited by two bugs:
[...]
> - rubygems doesn't work:
>  http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=588125

I trace the following error:
--
$ gem1.9.1 list
/usr/lib/ruby/1.9.1/rubygems.rb:634:in `path': undefined method `path'
for #<Gem::ConfigFile:0x000000014a09d8> (NoMethodError)
--

I got a result:
--
$ ruby1.9.1 -e 'p Gem.path; require "rubygems"; p Gem.path'
["/home/akira/.gem/ruby/1.9.1", "/usr/lib/ruby/gems/1.9.1"]
/usr/lib/ruby/1.9.1/rubygems/source_index.rb:68:in
`installed_spec_directories': undefined method `path' for Gem:Module
(NoMethodError)

$ ruby1.9.1 -e 'p Gem.path; begin; require "not exist"; rescue
LoadError; end; require "rubygems"; p Gem.path'
["/home/akira/.gem/ruby/1.9.1", "/usr/lib/ruby/gems/1.9.1"]
["/home/akira/.gem/ruby/1.9.1", "/var/lib/gems/1.9.1"]

$ ruby1.9.1 -e 'p Gem.path; Gem::QuickLoader.remove; require
"rubygems"; p Gem.path'                                          ~
["/home/akira/.gem/ruby/1.9.1", "/usr/lib/ruby/gems/1.9.1"]
["/home/akira/.gem/ruby/1.9.1", "/var/lib/gems/1.9.1"]
--

There is difference:
--
$ diff -u ruby_1_9_2/lib/rubygems.rb /usr/lib/ruby/1.9.1/rubygems.rb |head -20
--- ruby_1_9_2/lib/rubygems.rb	2010-08-02 09:53:36.000000000 +0900
+++ /usr/lib/ruby/1.9.1/rubygems.rb	2010-08-26 07:05:24.000000000 +0900
@@ -4,14 +4,8 @@
 # All rights reserved.
 # See LICENSE.txt for permissions.
 #++
-
 gem_disabled = !defined? Gem

-unless gem_disabled
-  # Nuke the Quickloader stuff
-  Gem::QuickLoader.remove
-end
-
 require 'rubygems/defaults'
 require 'thread'
 require 'etc'
@@ -492,8 +486,26 @@

   ##
--
(ruby_1_9_2 is tree of ruby_1_9_2 in the svn.
/usr/lib/ruby/1.9.1/rubygems.rb is provided rubygems-1.3.1.deb)

When ruby requires "rubygems", rubygems.rb will require
"rubygems/defaults/operating_system".
And ruby re-requires "rubygems" internally because the file is not given.

On the 2nd require "rubygems", Gem::QuickLoader.remove is called.
The method removes Gem module methods defined in gem_prelude.
But the 2nd require "rubygems" don't executed because ruby interpreter
is already in requiring rubygems.
So some pre-defined Gem module methods is missing
and chance of new definition of these methods isn't given.

Calling Gem::QuickLoader.remove in top of rubygems.rb
can avoid "circular require" of rubygems.
(It sets @loaded_full_rubygems_library)

-- 
ay <akira at arika.org>, <akira at debian.org>, ...






More information about the Pkg-ruby-extras-maintainers mailing list