From 3434676e9e3c87c39fe4a8c411a041449efc7446 Mon Sep 17 00:00:00 2001 From: drbrain Date: Fri, 5 Aug 2011 01:00:01 +0000 Subject: * 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] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@32852 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 21 ++++++++++++ lib/rubygems.rb | 9 +++-- lib/rubygems/commands/cleanup_command.rb | 11 ++++--- lib/rubygems/commands/setup_command.rb | 2 +- lib/rubygems/gem_openssl.rb | 8 ++--- lib/rubygems/remote_fetcher.rb | 2 +- lib/rubygems/requirement.rb | 4 +++ lib/rubygems/test_case.rb | 22 ++++++++++++- lib/rubygems/test_utilities.rb | 2 ++ test/rubygems/test_gem.rb | 14 ++++++++ test/rubygems/test_gem_commands_cleanup_command.rb | 38 ++++++++++++++++++++++ test/rubygems/test_gem_commands_sources_command.rb | 2 ++ test/rubygems/test_gem_remote_fetcher.rb | 22 +++++++++++++ 13 files changed, 143 insertions(+), 14 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0d39ab20a3..6c329ea7f4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,24 @@ +Fri Aug 05 09:48:22 2011 Eric Hodel + + * 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 diff --git a/lib/rubygems.rb b/lib/rubygems.rb index 9316a2569f..eda59ef725 100644 --- a/lib/rubygems.rb +++ b/lib/rubygems.rb @@ -118,7 +118,7 @@ require "rubygems/deprecate" # -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 @@ module Gem 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 @@ end # 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. " \ diff --git a/lib/rubygems/commands/cleanup_command.rb b/lib/rubygems/commands/cleanup_command.rb index 49bf660bc1..124c4c203a 100644 --- a/lib/rubygems/commands/cleanup_command.rb +++ b/lib/rubygems/commands/cleanup_command.rb @@ -61,6 +61,8 @@ installed elsewhere in GEM_PATH the cleanup command won't touch it. 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 @@ installed elsewhere in GEM_PATH the cleanup command won't touch it. :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" diff --git a/lib/rubygems/commands/setup_command.rb b/lib/rubygems/commands/setup_command.rb index 97880bc45c..52a3b88fe3 100644 --- a/lib/rubygems/commands/setup_command.rb +++ b/lib/rubygems/commands/setup_command.rb @@ -124,7 +124,7 @@ By default, this RubyGems will install gem as: 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!" diff --git a/lib/rubygems/gem_openssl.rb b/lib/rubygems/gem_openssl.rb index 9d5fa4ac77..682058f2c1 100644 --- a/lib/rubygems/gem_openssl.rb +++ b/lib/rubygems/gem_openssl.rb @@ -36,6 +36,8 @@ module Gem end end +# :stopdoc: + begin require 'openssl' @@ -44,7 +46,7 @@ begin 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 @@ rescue LoadError, StandardError 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 @@ module Gem::SSL end -# :startdoc: - diff --git a/lib/rubygems/remote_fetcher.rb b/lib/rubygems/remote_fetcher.rb index ba546ca926..e0d12987f3 100644 --- a/lib/rubygems/remote_fetcher.rb +++ b/lib/rubygems/remote_fetcher.rb @@ -85,7 +85,7 @@ class Gem::RemoteFetcher return if found.empty? - spec, source_uri = found.first + spec, source_uri = found.sort_by { |(s,_)| s.version }.last download spec, source_uri end diff --git a/lib/rubygems/requirement.rb b/lib/rubygems/requirement.rb index 3809dfad98..99bfd49364 100644 --- a/lib/rubygems/requirement.rb +++ b/lib/rubygems/requirement.rb @@ -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 @@ module YAML end end +# :startdoc: + ## # A Requirement is a set of one or more version restrictions. It supports a # few (=, !=, >, <, >=, <=, ~>) different restriction operators. diff --git a/lib/rubygems/test_case.rb b/lib/rubygems/test_case.rb index 6ab5095267..6aed3487c6 100644 --- a/lib/rubygems/test_case.rb +++ b/lib/rubygems/test_case.rb @@ -257,6 +257,25 @@ class Gem::TestCase < MiniTest::Unit::TestCase Gem::Installer.new(gem, :wrappers => true).install 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 @@ -678,12 +697,13 @@ Also, a list: 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 diff --git a/lib/rubygems/test_utilities.rb b/lib/rubygems/test_utilities.rb index 69ff60d101..1a8fb5a0ad 100644 --- a/lib/rubygems/test_utilities.rb +++ b/lib/rubygems/test_utilities.rb @@ -139,6 +139,8 @@ end ## # 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. diff --git a/test/rubygems/test_gem.rb b/test/rubygems/test_gem.rb index 20f2a93c04..273ba8f640 100644 --- a/test/rubygems/test_gem.rb +++ b/test/rubygems/test_gem.rb @@ -598,6 +598,20 @@ class TestGem < Gem::TestCase 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 diff --git a/test/rubygems/test_gem_commands_cleanup_command.rb b/test/rubygems/test_gem_commands_cleanup_command.rb index 22bbfb7a2f..40c7b30539 100644 --- a/test/rubygems/test_gem_commands_cleanup_command.rb +++ b/test/rubygems/test_gem_commands_cleanup_command.rb @@ -38,6 +38,44 @@ class TestGemCommandsCleanupCommand < Gem::TestCase 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 diff --git a/test/rubygems/test_gem_commands_sources_command.rb b/test/rubygems/test_gem_commands_sources_command.rb index 3d06940232..8b439025ed 100644 --- a/test/rubygems/test_gem_commands_sources_command.rb +++ b/test/rubygems/test_gem_commands_sources_command.rb @@ -6,6 +6,8 @@ class TestGemCommandsSourcesCommand < Gem::TestCase def setup super + util_setup_fake_fetcher + @cmd = Gem::Commands::SourcesCommand.new @new_repo = "http://beta-gems.example.com" diff --git a/test/rubygems/test_gem_remote_fetcher.rb b/test/rubygems/test_gem_remote_fetcher.rb index 2ccb8ce37a..3bdba5e072 100644 --- a/test/rubygems/test_gem_remote_fetcher.rb +++ b/test/rubygems/test_gem_remote_fetcher.rb @@ -346,6 +346,28 @@ gems: 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 -- cgit v1.2.3