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

ruby-changes:20804

From: drbrain <ko1@a...>
Date: Fri, 5 Aug 2011 10:03:24 +0900 (JST)
Subject: [ruby-changes:20804] drbrain:r32852 (trunk): * lib/rubygems: Import RubyGems 1.8.7:

drbrain	2011-08-05 10:00:01 +0900 (Fri, 05 Aug 2011)

  New Revision: 32852

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

  Log:
    * lib/rubygems:  Import RubyGems 1.8.7:
      Added missing require for `gem uninstall --format-executable`.
    
      The correct name of the executable being uninstalled is now displayed
      with --format-executable.
    
      Fixed `gem unpack uninstalled_gem` default version picker.
    
      RubyGems no longer claims a nonexistent gem can be uninstalled.
    
      `gem which` no longer claims directories are requirable files.
    
      `gem cleanup` continues cleaning up gems if one can't be uninstalled
      due to permissions.  Issue #82.
    
      Gem repository directories are no longer created world-writable.
      Patch by Sakuro OZAWA.  [Ruby 1.9 - Bug #4930]

  Modified files:
    trunk/ChangeLog
    trunk/lib/rubygems/commands/cleanup_command.rb
    trunk/lib/rubygems/commands/setup_command.rb
    trunk/lib/rubygems/gem_openssl.rb
    trunk/lib/rubygems/remote_fetcher.rb
    trunk/lib/rubygems/requirement.rb
    trunk/lib/rubygems/test_case.rb
    trunk/lib/rubygems/test_utilities.rb
    trunk/lib/rubygems.rb
    trunk/test/rubygems/test_gem.rb
    trunk/test/rubygems/test_gem_commands_cleanup_command.rb
    trunk/test/rubygems/test_gem_commands_sources_command.rb
    trunk/test/rubygems/test_gem_remote_fetcher.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 32851)
+++ ChangeLog	(revision 32852)
@@ -1,3 +1,24 @@
+Fri Aug 05 09:48:22 2011  Eric Hodel  <drbrain@s...>
+
+	* lib/rubygems:  Import RubyGems 1.8.7:
+	  Added missing require for `gem uninstall --format-executable`.
+
+	  The correct name of the executable being uninstalled is now displayed
+	  with --format-executable.
+
+	  Fixed `gem unpack uninstalled_gem` default version picker.
+
+	  RubyGems no longer claims a nonexistent gem can be uninstalled.
+
+	  `gem which` no longer claims directories are requirable files.
+
+	  `gem cleanup` continues cleaning up gems if one can't be uninstalled
+	  due to permissions.  Issue #82.
+
+	  Gem repository directories are no longer created world-writable.
+	  Patch by Sakuro OZAWA.  [Ruby 1.9 - Bug #4930]
+
+
 Fri Aug  5 09:48:00 2011  Nobuyoshi Nakada  <nobu@r...>
 
 
Index: lib/rubygems/remote_fetcher.rb
===================================================================
--- lib/rubygems/remote_fetcher.rb	(revision 32851)
+++ lib/rubygems/remote_fetcher.rb	(revision 32852)
@@ -85,7 +85,7 @@
 
     return if found.empty?
 
-    spec, source_uri = found.first
+    spec, source_uri = found.sort_by { |(s,_)| s.version }.last
 
     download spec, source_uri
   end
Index: lib/rubygems/commands/cleanup_command.rb
===================================================================
--- lib/rubygems/commands/cleanup_command.rb	(revision 32851)
+++ lib/rubygems/commands/cleanup_command.rb	(revision 32852)
@@ -61,6 +61,8 @@
 
     deps = deplist.strongly_connected_components.flatten.reverse
 
+    original_path = Gem.path
+
     deps.each do |spec|
       if options[:dryrun] then
         say "Dry Run Mode: Would uninstall #{spec.full_name}"
@@ -74,20 +76,21 @@
           :version => "= #{spec.version}",
         }
 
-        if Gem.user_dir == spec.base_dir then
-          uninstall_options[:install_dir] = spec.base_dir
-        end
+        uninstall_options[:user_install] = Gem.user_dir == spec.base_dir
 
         uninstaller = Gem::Uninstaller.new spec.name, uninstall_options
 
         begin
           uninstaller.uninstall
         rescue Gem::DependencyRemovalException, Gem::InstallError,
-               Gem::GemNotInHomeException => e
+               Gem::GemNotInHomeException, Gem::FilePermissionError => e
           say "Unable to uninstall #{spec.full_name}:"
           say "\t#{e.class}: #{e.message}"
         end
       end
+
+      # Restore path Gem::Uninstaller may have change
+      Gem.use_paths(*original_path)
     end
 
     say "Clean Up Complete"
Index: lib/rubygems/commands/setup_command.rb
===================================================================
--- lib/rubygems/commands/setup_command.rb	(revision 32851)
+++ lib/rubygems/commands/setup_command.rb	(revision 32852)
@@ -124,7 +124,7 @@
                       open release_notes do |io|
                         text = io.gets '==='
                         text << io.gets('===')
-                        text[0...-3]
+                        text[0...-3].sub(/^# coding:.*?^=/m, '')
                       end
                     else
                       "Oh-no! Unable to find release notes!"
Index: lib/rubygems/requirement.rb
===================================================================
--- lib/rubygems/requirement.rb	(revision 32851)
+++ lib/rubygems/requirement.rb	(revision 32852)
@@ -1,5 +1,7 @@
 require "rubygems/version"
 
+# :stopdoc:
+
 # Hack to handle syck's DefaultKey bug with psych
 #
 # Quick note! If/when psych loads in 1.9, it will redefine
@@ -19,6 +21,8 @@
   end
 end
 
+# :startdoc:
+
 ##
 # A Requirement is a set of one or more version restrictions. It supports a
 # few (<tt>=, !=, >, <, >=, <=, ~></tt>) different restriction operators.
Index: lib/rubygems/test_case.rb
===================================================================
--- lib/rubygems/test_case.rb	(revision 32851)
+++ lib/rubygems/test_case.rb	(revision 32852)
@@ -258,6 +258,25 @@
   end
 
   ##
+  # Builds and installs the Gem::Specification +spec+ into the user dir
+
+  def install_gem_user spec
+    require 'rubygems/installer'
+
+    use_ui Gem::MockGemUi.new do
+      Dir.chdir @tempdir do
+        Gem::Builder.new(spec).build
+      end
+    end
+
+    gem = File.join(@tempdir, File.basename(spec.cache_file)).untaint
+
+    i = Gem::Installer.new(gem, :wrappers => true, :user_install => true)
+    i.install
+    i.spec
+  end
+
+  ##
   # Uninstalls the Gem::Specification +spec+
   def uninstall_gem spec
     require 'rubygems/uninstaller'
@@ -678,12 +697,13 @@
     end
 
     v = Gem.marshal_version
+
     Gem::Specification.each do |spec|
       path = "#{@gem_repo}quick/Marshal.#{v}/#{spec.original_name}.gemspec.rz"
       data = Marshal.dump spec
       data_deflate = Zlib::Deflate.deflate data
       @fetcher.data[path] = data_deflate
-    end
+    end unless Gem::RemoteFetcher === @fetcher # HACK for test_download_to_cache
 
     nil # force errors
   end
Index: lib/rubygems/test_utilities.rb
===================================================================
--- lib/rubygems/test_utilities.rb	(revision 32851)
+++ lib/rubygems/test_utilities.rb	(revision 32852)
@@ -139,6 +139,8 @@
 ##
 # A StringIO duck-typed class that uses Tempfile instead of String as the
 # backing store.
+#
+# This is available when rubygems/test_utilities is required.
 #--
 # This class was added to flush out problems in Rubinius' IO implementation.
 
Index: lib/rubygems/gem_openssl.rb
===================================================================
--- lib/rubygems/gem_openssl.rb	(revision 32851)
+++ lib/rubygems/gem_openssl.rb	(revision 32852)
@@ -36,6 +36,8 @@
   end
 end
 
+# :stopdoc:
+
 begin
   require 'openssl'
 
@@ -44,7 +46,7 @@
 
   Gem.ssl_available = !!OpenSSL::Digest::SHA1
 
-  class OpenSSL::X509::Certificate # :nodoc:
+  class OpenSSL::X509::Certificate
     # Check the validity of this certificate.
     def check_validity(issuer_cert = nil, time = Time.now)
       ret = if @not_before && @not_before > time
@@ -66,8 +68,6 @@
   Gem.ssl_available = false
 end
 
-# :stopdoc:
-
 module Gem::SSL
 
   # We make our own versions of the constants here.  This allows us
@@ -88,5 +88,3 @@
 
 end
 
-# :startdoc:
-
Index: lib/rubygems.rb
===================================================================
--- lib/rubygems.rb	(revision 32851)
+++ lib/rubygems.rb	(revision 32852)
@@ -118,7 +118,7 @@
 # -The RubyGems Team
 
 module Gem
-  VERSION = '1.8.6.1'
+  VERSION = '1.8.7'
 
   ##
   # Raised when RubyGems is unable to load or activate a gem.  Contains the
@@ -444,11 +444,16 @@
   def self.ensure_gem_subdirectories dir = Gem.dir
     require 'fileutils'
 
+    old_umask = File.umask
+    File.umask old_umask | 022
+
     %w[cache doc gems specifications].each do |name|
       subdir = File.join dir, name
       next if File.exist? subdir
       FileUtils.mkdir_p subdir rescue nil # in case of perms issues -- lame
     end
+  ensure
+    File.umask old_umask
   end
 
   ##
@@ -1206,7 +1211,7 @@
 # Otherwise return a path to the share area as define by
 # "#{ConfigMap[:datadir]}/#{package_name}".
 
-def RbConfig.datadir(package_name)
+def RbConfig.datadir(package_name) # :nodoc:
   warn "#{Gem.location_of_caller.join ':'}:Warning: " \
     "RbConfig.datadir is deprecated and will be removed on or after " \
     "August 2011.  " \
Index: test/rubygems/test_gem_commands_cleanup_command.rb
===================================================================
--- test/rubygems/test_gem_commands_cleanup_command.rb	(revision 32851)
+++ test/rubygems/test_gem_commands_cleanup_command.rb	(revision 32852)
@@ -38,6 +38,44 @@
     refute_path_exists @b_1.gem_dir
   end
 
+  def test_execute_all_user
+    @a_1_1 = quick_spec 'a', '1.1'
+    @a_1_1 = install_gem_user @a_1_1 # pick up user install path
+
+    Gem::Specification.dirs = [Gem.dir, Gem.user_dir]
+
+    assert_path_exists @a_1.gem_dir
+    assert_path_exists @a_1_1.gem_dir
+
+    @cmd.options[:args] = %w[a]
+
+    @cmd.execute
+
+    refute_path_exists @a_1.gem_dir
+    refute_path_exists @a_1_1.gem_dir
+  end
+
+  def test_execute_all_user_no_sudo
+    FileUtils.chmod 0555, @gemhome
+
+    @a_1_1 = quick_spec 'a', '1.1'
+    @a_1_1 = install_gem_user @a_1_1 # pick up user install path
+
+    Gem::Specification.dirs = [Gem.dir, Gem.user_dir]
+
+    assert_path_exists @a_1.gem_dir
+    assert_path_exists @a_1_1.gem_dir
+
+    @cmd.options[:args] = %w[a]
+
+    @cmd.execute
+
+    assert_path_exists @a_1.gem_dir
+    refute_path_exists @a_1_1.gem_dir
+  ensure
+    FileUtils.chmod 0755, @gemhome
+  end unless win_platform?
+
   def test_execute_dry_run
     @cmd.options[:args] = %w[a]
     @cmd.options[:dryrun] = true
Index: test/rubygems/test_gem_remote_fetcher.rb
===================================================================
--- test/rubygems/test_gem_remote_fetcher.rb	(revision 32851)
+++ test/rubygems/test_gem_remote_fetcher.rb	(revision 32852)
@@ -346,6 +346,28 @@
     assert_equal 'unsupported URI scheme ftp', e.message
   end
 
+  def test_download_to_cache
+    @a2, @a2_gem = util_gem 'a', '2'
+
+    util_setup_spec_fetcher @a1, @a2
+    @fetcher.instance_variable_set :@a1, @a1
+    @fetcher.instance_variable_set :@a2, @a2
+    def @fetcher.fetch_path uri, mtime = nil, head = false
+      case uri.request_uri
+      when /#{@a1.spec_name}/ then
+        Gem.deflate Marshal.dump @a1
+      when /#{@a2.spec_name}/ then
+        Gem.deflate Marshal.dump @a2
+      else
+        uri.to_s
+      end
+    end
+
+    gem = Gem::RemoteFetcher.fetcher.download_to_cache dep 'a'
+
+    assert_equal @a2.file_name, File.basename(gem)
+  end
+
   def test_explicit_proxy
     use_ui @ui do
       fetcher = Gem::RemoteFetcher.new @proxy_uri
Index: test/rubygems/test_gem_commands_sources_command.rb
===================================================================
--- test/rubygems/test_gem_commands_sources_command.rb	(revision 32851)
+++ test/rubygems/test_gem_commands_sources_command.rb	(revision 32852)
@@ -6,6 +6,8 @@
   def setup
     super
 
+    util_setup_fake_fetcher
+
     @cmd = Gem::Commands::SourcesCommand.new
 
     @new_repo = "http://beta-gems.example.com"
Index: test/rubygems/test_gem.rb
===================================================================
--- test/rubygems/test_gem.rb	(revision 32851)
+++ test/rubygems/test_gem.rb	(revision 32852)
@@ -598,6 +598,20 @@
     assert File.directory? File.join(@gemhome, "cache")
   end
 
+  def test_self_ensure_gem_directories_safe_permissions
+    FileUtils.rm_r @gemhome
+    Gem.use_paths @gemhome
+
+    old_umask = File.umask
+    File.umask 0
+    Gem.ensure_gem_subdirectories @gemhome
+
+    assert_equal 0, File::Stat.new(@gemhome).mode & 022
+    assert_equal 0, File::Stat.new(File.join(@gemhome, "cache")).mode & 022
+  ensure
+    File.umask old_umask
+  end unless win_platform?
+
   def test_self_ensure_gem_directories_missing_parents
     gemdir = File.join @tempdir, 'a/b/c/gemdir'
     FileUtils.rm_rf File.join(@tempdir, 'a') rescue nil

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

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