зеркало из https://github.com/github/ruby.git
* 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:
Родитель
d24997cce1
Коммит
3434676e9e
21
ChangeLog
21
ChangeLog
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче