mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* lib/rubygems: Import RubyGems from master as of commit 523551c
* test/rubygems: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42257 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
d82e5cc4cc
commit
310d77d4b0
14 changed files with 311 additions and 212 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
Wed Jul 31 07:09:07 2013 Eric Hodel <drbrain@segment7.net>
|
||||||
|
|
||||||
|
* lib/rubygems: Import RubyGems from master as of commit 523551c
|
||||||
|
* test/rubygems: ditto.
|
||||||
|
|
||||||
Tue Jul 30 22:21:54 2013 Masaki Matsushita <glass.saga@gmail.com>
|
Tue Jul 30 22:21:54 2013 Masaki Matsushita <glass.saga@gmail.com>
|
||||||
|
|
||||||
* test/ruby/test_hash.rb: add a test for enumeration order of Hash.
|
* test/ruby/test_hash.rb: add a test for enumeration order of Hash.
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
require 'rbconfig'
|
require 'rbconfig'
|
||||||
|
|
||||||
module Gem
|
module Gem
|
||||||
VERSION = '2.1.0'
|
VERSION = '2.1.0.rc.1'
|
||||||
end
|
end
|
||||||
|
|
||||||
# Must be first since it unloads the prelude from 1.9.2
|
# Must be first since it unloads the prelude from 1.9.2
|
||||||
|
|
|
@ -16,18 +16,8 @@ class Gem::Commands::OutdatedCommand < Gem::Command
|
||||||
end
|
end
|
||||||
|
|
||||||
def execute
|
def execute
|
||||||
Gem::Specification.outdated.sort.each do |name|
|
Gem::Specification.outdated_and_latest_version.each do |spec, remote_version|
|
||||||
local = Gem::Specification.find_all_by_name(name).max
|
say "#{spec.name} (#{spec.version} < #{remote_version})"
|
||||||
dep = Gem::Dependency.new local.name, ">= #{local.version}"
|
|
||||||
remotes, _ = Gem::SpecFetcher.fetcher.spec_for_dependency dep
|
|
||||||
|
|
||||||
next if remotes.empty?
|
|
||||||
|
|
||||||
remotes.sort! { |a,b| a[0].version <=> b[0].version }
|
|
||||||
|
|
||||||
highest = remotes.last.first
|
|
||||||
|
|
||||||
say "#{local.name} (#{local.version} < #{highest.version})"
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -4,8 +4,23 @@
|
||||||
# See LICENSE.txt for permissions.
|
# See LICENSE.txt for permissions.
|
||||||
#++
|
#++
|
||||||
|
|
||||||
|
require 'rubygems/user_interaction'
|
||||||
|
require 'thread'
|
||||||
|
|
||||||
class Gem::Ext::Builder
|
class Gem::Ext::Builder
|
||||||
|
|
||||||
|
include Gem::UserInteraction
|
||||||
|
|
||||||
|
##
|
||||||
|
# The builder shells-out to run various commands after changing the
|
||||||
|
# directory. This means multiple installations cannot be allowed to build
|
||||||
|
# extensions in parallel as they may change each other's directories leading
|
||||||
|
# to broken extensions or failed installations.
|
||||||
|
|
||||||
|
CHDIR_MUTEX = Mutex.new # :nodoc:
|
||||||
|
|
||||||
|
attr_accessor :build_args # :nodoc:
|
||||||
|
|
||||||
def self.class_name
|
def self.class_name
|
||||||
name =~ /Ext::(.*)Builder/
|
name =~ /Ext::(.*)Builder/
|
||||||
$1.downcase
|
$1.downcase
|
||||||
|
@ -63,5 +78,108 @@ class Gem::Ext::Builder
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
##
|
||||||
|
# Creates a new extension builder for +spec+ using the given +build_args+.
|
||||||
|
# The gem for +spec+ is unpacked in +gem_dir+.
|
||||||
|
|
||||||
|
def initialize spec, build_args
|
||||||
|
@spec = spec
|
||||||
|
@build_args = build_args
|
||||||
|
@gem_dir = spec.gem_dir
|
||||||
|
|
||||||
|
@ran_rake = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
##
|
||||||
|
# Chooses the extension builder class for +extension+
|
||||||
|
|
||||||
|
def builder_for extension # :nodoc:
|
||||||
|
case extension
|
||||||
|
when /extconf/ then
|
||||||
|
Gem::Ext::ExtConfBuilder
|
||||||
|
when /configure/ then
|
||||||
|
Gem::Ext::ConfigureBuilder
|
||||||
|
when /rakefile/i, /mkrf_conf/i then
|
||||||
|
@ran_rake = true
|
||||||
|
Gem::Ext::RakeBuilder
|
||||||
|
when /CMakeLists.txt/ then
|
||||||
|
Gem::Ext::CmakeBuilder
|
||||||
|
else
|
||||||
|
extension_dir = File.join @gem_dir, File.dirname(extension)
|
||||||
|
|
||||||
|
message = "No builder for extension '#{extension}'"
|
||||||
|
build_error extension_dir, message
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
##
|
||||||
|
# Logs the build +output+ in +build_dir+, then raises ExtensionBuildError.
|
||||||
|
|
||||||
|
def build_error build_dir, output, backtrace = nil # :nodoc:
|
||||||
|
gem_make_out = File.join build_dir, 'gem_make.out'
|
||||||
|
|
||||||
|
open gem_make_out, 'wb' do |io| io.puts output end
|
||||||
|
|
||||||
|
message = <<-EOF
|
||||||
|
ERROR: Failed to build gem native extension.
|
||||||
|
|
||||||
|
#{output}
|
||||||
|
|
||||||
|
Gem files will remain installed in #{@gem_dir} for inspection.
|
||||||
|
Results logged to #{gem_make_out}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
raise Gem::Installer::ExtensionBuildError, message, backtrace
|
||||||
|
end
|
||||||
|
|
||||||
|
def build_extension extension, dest_path # :nodoc:
|
||||||
|
results = []
|
||||||
|
|
||||||
|
extension ||= '' # I wish I knew why this line existed
|
||||||
|
extension_dir = File.join @gem_dir, File.dirname(extension)
|
||||||
|
|
||||||
|
builder = builder_for extension
|
||||||
|
|
||||||
|
begin
|
||||||
|
FileUtils.mkdir_p dest_path
|
||||||
|
|
||||||
|
CHDIR_MUTEX.synchronize do
|
||||||
|
Dir.chdir extension_dir do
|
||||||
|
results = builder.build(extension, @gem_dir, dest_path,
|
||||||
|
results, @build_args)
|
||||||
|
|
||||||
|
say results.join("\n") if Gem.configuration.really_verbose
|
||||||
|
end
|
||||||
|
end
|
||||||
|
rescue
|
||||||
|
build_error extension_dir, results.join("\n"), $@
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
##
|
||||||
|
# Builds extensions. Valid types of extensions are extconf.rb files,
|
||||||
|
# configure scripts and rakefiles or mkrf_conf files.
|
||||||
|
|
||||||
|
def build_extensions
|
||||||
|
return if @spec.extensions.empty?
|
||||||
|
|
||||||
|
if @build_args.empty?
|
||||||
|
say "Building native extensions. This could take a while..."
|
||||||
|
else
|
||||||
|
say "Building native extensions with: '#{@build_args.join ' '}'"
|
||||||
|
say "This could take a while..."
|
||||||
|
end
|
||||||
|
|
||||||
|
dest_path = File.join @gem_dir, @spec.require_paths.first
|
||||||
|
|
||||||
|
@ran_rake = false # only run rake once
|
||||||
|
|
||||||
|
@spec.extensions.each do |extension|
|
||||||
|
break if @ran_rake
|
||||||
|
|
||||||
|
build_extension extension, dest_path
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -661,73 +661,20 @@ TEXT
|
||||||
# configure scripts and rakefiles or mkrf_conf files.
|
# configure scripts and rakefiles or mkrf_conf files.
|
||||||
|
|
||||||
def build_extensions
|
def build_extensions
|
||||||
return if spec.extensions.empty?
|
builder = Gem::Ext::Builder.new spec, @build_args
|
||||||
|
|
||||||
if @build_args.empty?
|
builder.build_extensions
|
||||||
say "Building native extensions. This could take a while..."
|
|
||||||
else
|
|
||||||
say "Building native extensions with: '#{@build_args.join(' ')}'"
|
|
||||||
say "This could take a while..."
|
|
||||||
end
|
|
||||||
|
|
||||||
dest_path = File.join gem_dir, spec.require_paths.first
|
|
||||||
ran_rake = false # only run rake once
|
|
||||||
|
|
||||||
spec.extensions.each do |extension|
|
|
||||||
break if ran_rake
|
|
||||||
results = []
|
|
||||||
|
|
||||||
extension ||= ""
|
|
||||||
extension_dir = File.join gem_dir, File.dirname(extension)
|
|
||||||
|
|
||||||
builder = case extension
|
|
||||||
when /extconf/ then
|
|
||||||
Gem::Ext::ExtConfBuilder
|
|
||||||
when /configure/ then
|
|
||||||
Gem::Ext::ConfigureBuilder
|
|
||||||
when /rakefile/i, /mkrf_conf/i then
|
|
||||||
ran_rake = true
|
|
||||||
Gem::Ext::RakeBuilder
|
|
||||||
when /CMakeLists.txt/ then
|
|
||||||
Gem::Ext::CmakeBuilder
|
|
||||||
else
|
|
||||||
message = "No builder for extension '#{extension}'"
|
|
||||||
extension_build_error extension_dir, message
|
|
||||||
end
|
|
||||||
|
|
||||||
begin
|
|
||||||
FileUtils.mkdir_p dest_path
|
|
||||||
|
|
||||||
Dir.chdir extension_dir do
|
|
||||||
results = builder.build(extension, gem_dir, dest_path,
|
|
||||||
results, @build_args)
|
|
||||||
|
|
||||||
say results.join("\n") if Gem.configuration.really_verbose
|
|
||||||
end
|
|
||||||
rescue
|
|
||||||
extension_build_error(extension_dir, results.join("\n"), $@)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
##
|
##
|
||||||
# Logs the build +output+ in +build_dir+, then raises ExtensionBuildError.
|
# Logs the build +output+ in +build_dir+, then raises ExtensionBuildError.
|
||||||
|
#
|
||||||
|
# TODO: Delete this for RubyGems 3. It remains for API compatibility
|
||||||
|
|
||||||
def extension_build_error(build_dir, output, backtrace = nil)
|
def extension_build_error(build_dir, output, backtrace = nil) # :nodoc:
|
||||||
gem_make_out = File.join build_dir, 'gem_make.out'
|
builder = Gem::Ext::Builder.new spec, @build_args
|
||||||
|
|
||||||
open gem_make_out, 'wb' do |io| io.puts output end
|
builder.build_error build_dir, output, backtrace
|
||||||
|
|
||||||
message = <<-EOF
|
|
||||||
ERROR: Failed to build gem native extension.
|
|
||||||
|
|
||||||
#{output}
|
|
||||||
|
|
||||||
Gem files will remain installed in #{gem_dir} for inspection.
|
|
||||||
Results logged to #{gem_make_out}
|
|
||||||
EOF
|
|
||||||
|
|
||||||
raise ExtensionBuildError, message, backtrace
|
|
||||||
end
|
end
|
||||||
|
|
||||||
##
|
##
|
||||||
|
|
|
@ -368,7 +368,7 @@ module Gem::Security
|
||||||
# Cipher used to encrypt the key pair used to sign gems.
|
# Cipher used to encrypt the key pair used to sign gems.
|
||||||
# Must be in the list returned by OpenSSL::Cipher.ciphers
|
# Must be in the list returned by OpenSSL::Cipher.ciphers
|
||||||
|
|
||||||
KEY_CIPHER = OpenSSL::Cipher.new('aes256') if defined?(OpenSSL::Cipher)
|
KEY_CIPHER = OpenSSL::Cipher.new('AES-256-CBC') if defined?(OpenSSL::Cipher)
|
||||||
|
|
||||||
##
|
##
|
||||||
# One year in seconds
|
# One year in seconds
|
||||||
|
|
|
@ -1016,25 +1016,43 @@ class Gem::Specification < Gem::BasicSpecification
|
||||||
end
|
end
|
||||||
|
|
||||||
##
|
##
|
||||||
# Return a list of all outdated specifications. This method is HEAVY
|
# Return a list of all outdated local gem names. This method is HEAVY
|
||||||
# as it must go fetch specifications from the server.
|
# as it must go fetch specifications from the server.
|
||||||
|
#
|
||||||
|
# Use outdated_and_latest_version if you wish to retrieve the latest remote
|
||||||
|
# version as well.
|
||||||
|
|
||||||
def self.outdated
|
def self.outdated
|
||||||
outdateds = []
|
outdated_and_latest_version.map { |local, _| local.name }
|
||||||
|
end
|
||||||
|
|
||||||
|
##
|
||||||
|
# Enumerates the outdated local gems yielding the local specification and
|
||||||
|
# the latest remote version.
|
||||||
|
#
|
||||||
|
# This method may take some time to return as it must check each local gem
|
||||||
|
# against the server's index.
|
||||||
|
|
||||||
|
def self.outdated_and_latest_version
|
||||||
|
return enum_for __method__ unless block_given?
|
||||||
|
|
||||||
# TODO: maybe we should switch to rubygems' version service?
|
# TODO: maybe we should switch to rubygems' version service?
|
||||||
fetcher = Gem::SpecFetcher.fetcher
|
fetcher = Gem::SpecFetcher.fetcher
|
||||||
|
|
||||||
latest_specs(true).each do |local|
|
latest_specs(true).each do |local_spec|
|
||||||
dependency = Gem::Dependency.new local.name, ">= #{local.version}"
|
dependency =
|
||||||
remotes, _ = fetcher.search_for_dependency dependency
|
Gem::Dependency.new local_spec.name, ">= #{local_spec.version}"
|
||||||
remotes = remotes.map { |n, _| n.version }
|
|
||||||
latest = remotes.sort.last
|
|
||||||
|
|
||||||
outdateds << local.name if latest and local.version < latest
|
remotes, = fetcher.search_for_dependency dependency
|
||||||
|
remotes = remotes.map { |n, _| n.version }
|
||||||
|
|
||||||
|
latest_remote = remotes.sort.last
|
||||||
|
|
||||||
|
yield [local_spec, latest_remote] if
|
||||||
|
latest_remote and local_spec.version < latest_remote
|
||||||
end
|
end
|
||||||
|
|
||||||
outdateds
|
nil
|
||||||
end
|
end
|
||||||
|
|
||||||
##
|
##
|
||||||
|
|
|
@ -1,30 +1,30 @@
|
||||||
-----BEGIN RSA PRIVATE KEY-----
|
-----BEGIN RSA PRIVATE KEY-----
|
||||||
Proc-Type: 4,ENCRYPTED
|
Proc-Type: 4,ENCRYPTED
|
||||||
DEK-Info: AES-256-CBC,1AC78C928C296A1D7C70D525B0F1051C
|
DEK-Info: DES-CBC,27887B3B3BAA3B18
|
||||||
|
|
||||||
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
|
||||||
-----END RSA PRIVATE KEY-----
|
-----END RSA PRIVATE KEY-----
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
require 'rubygems/test_case'
|
require 'rubygems/test_case'
|
||||||
require 'rubygems/ext'
|
require 'rubygems/ext'
|
||||||
|
require 'rubygems/installer'
|
||||||
|
|
||||||
class TestGemExtBuilder < Gem::TestCase
|
class TestGemExtBuilder < Gem::TestCase
|
||||||
|
|
||||||
|
@ -13,6 +14,10 @@ class TestGemExtBuilder < Gem::TestCase
|
||||||
FileUtils.mkdir_p @dest_path
|
FileUtils.mkdir_p @dest_path
|
||||||
|
|
||||||
@orig_DESTDIR = ENV['DESTDIR']
|
@orig_DESTDIR = ENV['DESTDIR']
|
||||||
|
|
||||||
|
@spec = quick_spec 'a'
|
||||||
|
|
||||||
|
@builder = Gem::Ext::Builder.new @spec, ''
|
||||||
end
|
end
|
||||||
|
|
||||||
def teardown
|
def teardown
|
||||||
|
@ -54,5 +59,93 @@ install:
|
||||||
assert_match %r%^install: destination$%, results
|
assert_match %r%^install: destination$%, results
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_build_extensions_none
|
||||||
|
use_ui @ui do
|
||||||
|
@builder.build_extensions
|
||||||
|
end
|
||||||
|
|
||||||
|
assert_equal '', @ui.output
|
||||||
|
assert_equal '', @ui.error
|
||||||
|
|
||||||
|
refute File.exist?('gem_make.out')
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_build_extensions_extconf_bad
|
||||||
|
@spec.extensions << 'extconf.rb'
|
||||||
|
|
||||||
|
e = assert_raises Gem::Installer::ExtensionBuildError do
|
||||||
|
use_ui @ui do
|
||||||
|
@builder.build_extensions
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
assert_match(/\AERROR: Failed to build gem native extension.$/, e.message)
|
||||||
|
|
||||||
|
assert_equal "Building native extensions. This could take a while...\n",
|
||||||
|
@ui.output
|
||||||
|
assert_equal '', @ui.error
|
||||||
|
|
||||||
|
gem_make_out = File.join @gemhome, 'gems', @spec.full_name, 'gem_make.out'
|
||||||
|
|
||||||
|
assert_match %r%#{Regexp.escape Gem.ruby} extconf\.rb%,
|
||||||
|
File.read(gem_make_out)
|
||||||
|
assert_match %r%#{Regexp.escape Gem.ruby}: No such file%,
|
||||||
|
File.read(gem_make_out)
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_build_extensions_unsupported
|
||||||
|
FileUtils.mkdir_p @spec.gem_dir
|
||||||
|
gem_make_out = File.join @spec.gem_dir, 'gem_make.out'
|
||||||
|
@spec.extensions << nil
|
||||||
|
|
||||||
|
e = assert_raises Gem::Installer::ExtensionBuildError do
|
||||||
|
use_ui @ui do
|
||||||
|
@builder.build_extensions
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
assert_match(/^\s*No builder for extension ''$/, e.message)
|
||||||
|
|
||||||
|
assert_equal "Building native extensions. This could take a while...\n",
|
||||||
|
@ui.output
|
||||||
|
assert_equal '', @ui.error
|
||||||
|
|
||||||
|
assert_equal "No builder for extension ''\n", File.read(gem_make_out)
|
||||||
|
ensure
|
||||||
|
FileUtils.rm_f gem_make_out
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_build_extensions_with_build_args
|
||||||
|
args = ["--aa", "--bb"]
|
||||||
|
@builder.build_args = args
|
||||||
|
@spec.extensions << 'extconf.rb'
|
||||||
|
|
||||||
|
FileUtils.mkdir_p @spec.gem_dir
|
||||||
|
|
||||||
|
open File.join(@spec.gem_dir, "extconf.rb"), "w" do |f|
|
||||||
|
f.write <<-'RUBY'
|
||||||
|
puts "IN EXTCONF"
|
||||||
|
extconf_args = File.join File.dirname(__FILE__), 'extconf_args'
|
||||||
|
File.open extconf_args, 'w' do |f|
|
||||||
|
f.puts ARGV.inspect
|
||||||
|
end
|
||||||
|
|
||||||
|
File.open 'Makefile', 'w' do |f|
|
||||||
|
f.puts "default:\n\techo built"
|
||||||
|
f.puts "install:\n\techo installed"
|
||||||
|
end
|
||||||
|
RUBY
|
||||||
|
end
|
||||||
|
|
||||||
|
use_ui @ui do
|
||||||
|
@builder.build_extensions
|
||||||
|
end
|
||||||
|
|
||||||
|
path = File.join @spec.gem_dir, "extconf_args"
|
||||||
|
|
||||||
|
assert_equal args.inspect, File.read(path).strip
|
||||||
|
assert File.directory? File.join(@spec.gem_dir, 'lib')
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -55,95 +55,6 @@ load Gem.bin_path('a', 'executable', version)
|
||||||
assert_equal expected, wrapper
|
assert_equal expected, wrapper
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_build_extensions_none
|
|
||||||
use_ui @ui do
|
|
||||||
@installer.build_extensions
|
|
||||||
end
|
|
||||||
|
|
||||||
assert_equal '', @ui.output
|
|
||||||
assert_equal '', @ui.error
|
|
||||||
|
|
||||||
refute File.exist?('gem_make.out')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_build_extensions_extconf_bad
|
|
||||||
@installer.spec = @spec
|
|
||||||
@spec.extensions << 'extconf.rb'
|
|
||||||
|
|
||||||
e = assert_raises Gem::Installer::ExtensionBuildError do
|
|
||||||
use_ui @ui do
|
|
||||||
@installer.build_extensions
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
assert_match(/\AERROR: Failed to build gem native extension.$/, e.message)
|
|
||||||
|
|
||||||
assert_equal "Building native extensions. This could take a while...\n",
|
|
||||||
@ui.output
|
|
||||||
assert_equal '', @ui.error
|
|
||||||
|
|
||||||
gem_make_out = File.join @gemhome, 'gems', @spec.full_name, 'gem_make.out'
|
|
||||||
|
|
||||||
assert_match %r%#{Regexp.escape Gem.ruby} extconf\.rb%,
|
|
||||||
File.read(gem_make_out)
|
|
||||||
assert_match %r%#{Regexp.escape Gem.ruby}: No such file%,
|
|
||||||
File.read(gem_make_out)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_build_extensions_unsupported
|
|
||||||
@installer.spec = @spec
|
|
||||||
FileUtils.mkdir_p @spec.gem_dir
|
|
||||||
gem_make_out = File.join @spec.gem_dir, 'gem_make.out'
|
|
||||||
@spec.extensions << nil
|
|
||||||
|
|
||||||
e = assert_raises Gem::Installer::ExtensionBuildError do
|
|
||||||
use_ui @ui do
|
|
||||||
@installer.build_extensions
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
assert_match(/^\s*No builder for extension ''$/, e.message)
|
|
||||||
|
|
||||||
assert_equal "Building native extensions. This could take a while...\n",
|
|
||||||
@ui.output
|
|
||||||
assert_equal '', @ui.error
|
|
||||||
|
|
||||||
assert_equal "No builder for extension ''\n", File.read(gem_make_out)
|
|
||||||
ensure
|
|
||||||
FileUtils.rm_f gem_make_out
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_build_extensions_with_build_args
|
|
||||||
args = ["--aa", "--bb"]
|
|
||||||
@installer.build_args = args
|
|
||||||
@installer.spec = @spec
|
|
||||||
@spec.extensions << 'extconf.rb'
|
|
||||||
|
|
||||||
File.open File.join(@spec.gem_dir, "extconf.rb"), "w" do |f|
|
|
||||||
f.write <<-'RUBY'
|
|
||||||
puts "IN EXTCONF"
|
|
||||||
extconf_args = File.join File.dirname(__FILE__), 'extconf_args'
|
|
||||||
File.open extconf_args, 'w' do |f|
|
|
||||||
f.puts ARGV.inspect
|
|
||||||
end
|
|
||||||
|
|
||||||
File.open 'Makefile', 'w' do |f|
|
|
||||||
f.puts "default:\n\techo built"
|
|
||||||
f.puts "install:\n\techo installed"
|
|
||||||
end
|
|
||||||
RUBY
|
|
||||||
end
|
|
||||||
|
|
||||||
use_ui @ui do
|
|
||||||
@installer.build_extensions
|
|
||||||
end
|
|
||||||
|
|
||||||
path = File.join @spec.gem_dir, "extconf_args"
|
|
||||||
|
|
||||||
assert_equal args.inspect, File.read(path).strip
|
|
||||||
assert File.directory? File.join(@spec.gem_dir, 'lib')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_check_executable_overwrite
|
def test_check_executable_overwrite
|
||||||
@installer.generate_bin
|
@installer.generate_bin
|
||||||
|
|
||||||
|
|
|
@ -64,13 +64,16 @@ class TestGemPackage < Gem::Package::TarTestCase
|
||||||
reader = Gem::Package::TarReader.new gem_io
|
reader = Gem::Package::TarReader.new gem_io
|
||||||
|
|
||||||
checksums = nil
|
checksums = nil
|
||||||
|
tar = nil
|
||||||
|
|
||||||
reader.each_entry do |entry|
|
reader.each_entry do |entry|
|
||||||
case entry.full_name
|
case entry.full_name
|
||||||
when 'checksums.yaml.gz'
|
when 'checksums.yaml.gz' then
|
||||||
Zlib::GzipReader.wrap entry do |io|
|
Zlib::GzipReader.wrap entry do |io|
|
||||||
checksums = io.read
|
checksums = io.read
|
||||||
end
|
end
|
||||||
|
when 'data.tar.gz' then
|
||||||
|
tar = entry.read
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -83,22 +86,17 @@ class TestGemPackage < Gem::Package::TarTestCase
|
||||||
metadata_sha1 = Digest::SHA1.hexdigest s.string
|
metadata_sha1 = Digest::SHA1.hexdigest s.string
|
||||||
metadata_sha512 = Digest::SHA512.hexdigest s.string
|
metadata_sha512 = Digest::SHA512.hexdigest s.string
|
||||||
|
|
||||||
data_digests = nil
|
|
||||||
util_tar do |tar|
|
|
||||||
data_digests = package.add_contents tar
|
|
||||||
end
|
|
||||||
|
|
||||||
expected = {
|
expected = {
|
||||||
'SHA512' => {
|
'SHA512' => {
|
||||||
'metadata.gz' => metadata_sha512,
|
'metadata.gz' => metadata_sha512,
|
||||||
'data.tar.gz' => data_digests['SHA512'].hexdigest,
|
'data.tar.gz' => Digest::SHA512.hexdigest(tar),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if defined?(OpenSSL::Digest) then
|
if defined?(OpenSSL::Digest) then
|
||||||
expected['SHA1'] = {
|
expected['SHA1'] = {
|
||||||
'metadata.gz' => metadata_sha1,
|
'metadata.gz' => metadata_sha1,
|
||||||
'data.tar.gz' => data_digests['SHA1'].hexdigest,
|
'data.tar.gz' => Digest::SHA1.hexdigest(tar),
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -99,7 +99,7 @@ class TestGemSecurity < Gem::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_class_create_key
|
def test_class_create_key
|
||||||
key = @SEC.create_key 256
|
key = @SEC.create_key 1024
|
||||||
|
|
||||||
assert_kind_of OpenSSL::PKey::RSA, key
|
assert_kind_of OpenSSL::PKey::RSA, key
|
||||||
end
|
end
|
||||||
|
@ -251,7 +251,7 @@ class TestGemSecurity < Gem::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_class_write
|
def test_class_write
|
||||||
key = @SEC.create_key 256
|
key = @SEC.create_key 1024
|
||||||
|
|
||||||
path = File.join @tempdir, 'test-private_key.pem'
|
path = File.join @tempdir, 'test-private_key.pem'
|
||||||
|
|
||||||
|
@ -265,7 +265,7 @@ class TestGemSecurity < Gem::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_class_write_encrypted
|
def test_class_write_encrypted
|
||||||
key = @SEC.create_key 256
|
key = @SEC.create_key 1024
|
||||||
|
|
||||||
path = File.join @tempdir, 'test-private_encrypted_key.pem'
|
path = File.join @tempdir, 'test-private_encrypted_key.pem'
|
||||||
|
|
||||||
|
@ -281,13 +281,13 @@ class TestGemSecurity < Gem::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_class_write_encrypted_cipher
|
def test_class_write_encrypted_cipher
|
||||||
key = @SEC.create_key 256
|
key = @SEC.create_key 1024
|
||||||
|
|
||||||
path = File.join @tempdir, 'test-private_encrypted__with_non_default_cipher_key.pem'
|
path = File.join @tempdir, 'test-private_encrypted__with_non_default_cipher_key.pem'
|
||||||
|
|
||||||
passphrase = 'It should be long.'
|
passphrase = 'It should be long.'
|
||||||
|
|
||||||
cipher = OpenSSL::Cipher.new('aes192')
|
cipher = OpenSSL::Cipher.new 'AES-192-CBC'
|
||||||
|
|
||||||
@SEC.write key, path, 0600, passphrase, cipher
|
@SEC.write key, path, 0600, passphrase, cipher
|
||||||
|
|
||||||
|
|
|
@ -828,6 +828,25 @@ dependencies: []
|
||||||
assert_equal %w[a], Gem::Specification.outdated
|
assert_equal %w[a], Gem::Specification.outdated
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_self_outdated_and_latest_remotes
|
||||||
|
util_clear_gems
|
||||||
|
util_setup_fake_fetcher true
|
||||||
|
|
||||||
|
a4 = quick_gem @a1.name, '4'
|
||||||
|
util_build_gem a4
|
||||||
|
b3 = quick_gem @b2.name, '3'
|
||||||
|
util_build_gem b3
|
||||||
|
util_setup_spec_fetcher @a1, @a2, @a3a, a4, @b2, b3
|
||||||
|
|
||||||
|
Gem::Specification.remove_spec @a1
|
||||||
|
Gem::Specification.remove_spec @a2
|
||||||
|
Gem::Specification.remove_spec a4
|
||||||
|
Gem::Specification.remove_spec b3
|
||||||
|
|
||||||
|
assert_equal [[@a3a, a4.version], [@b2, b3.version]],
|
||||||
|
Gem::Specification.outdated_and_latest_version.to_a
|
||||||
|
end
|
||||||
|
|
||||||
DATA_PATH = File.expand_path "../data", __FILE__
|
DATA_PATH = File.expand_path "../data", __FILE__
|
||||||
|
|
||||||
def test_handles_private_null_type
|
def test_handles_private_null_type
|
||||||
|
|
Loading…
Add table
Reference in a new issue