* 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
This commit is contained in:
drbrain 2011-08-05 01:00:01 +00:00
Родитель d24997cce1
Коммит 3434676e9e
13 изменённых файлов: 143 добавлений и 14 удалений

Просмотреть файл

@ -1,3 +1,24 @@
Fri Aug 05 09:48:22 2011 Eric Hodel <drbrain@segment7.net>
* 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@ruby-lang.org>

Просмотреть файл

@ -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. " \

Просмотреть файл

@ -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"

Просмотреть файл

@ -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!"

Просмотреть файл

@ -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:

Просмотреть файл

@ -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

Просмотреть файл

@ -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 (<tt>=, !=, >, <, >=, <=, ~></tt>) different restriction operators.

Просмотреть файл

@ -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

Просмотреть файл

@ -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.

Просмотреть файл

@ -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

Просмотреть файл

@ -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

Просмотреть файл

@ -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"

Просмотреть файл

@ -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