From f8bcd57cb7223c59901cb9c73a4be976f3a583e8 Mon Sep 17 00:00:00 2001 From: drbrain Date: Thu, 19 Dec 2013 03:05:37 +0000 Subject: * lib/rubygems: Update to RubyGems master af60443. Changes include: * Improved speed of `gem install --ignore-dependencies`. * Open read-write for exclusive flock. [ruby-trunk - Bug #9257] * Remove specification before install to prevent infinite loop. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@44286 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 10 ++++++++++ lib/rubygems.rb | 2 +- lib/rubygems/commands/install_command.rb | 32 +++++++++++++++++++------------- lib/rubygems/installer.rb | 2 ++ test/rubygems/test_gem_installer.rb | 4 ++++ 5 files changed, 36 insertions(+), 14 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6ab9eccaa2..9ff18557ea 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +Thu Dec 19 12:05:17 2013 Eric Hodel + + * lib/rubygems: Update to RubyGems master af60443. Changes include: + + * Improved speed of `gem install --ignore-dependencies`. + + * Open read-write for exclusive flock. [ruby-trunk - Bug #9257] + + * Remove specification before install to prevent infinite loop. + Thu Dec 19 11:23:49 2013 Aman Gupta * vm_insnhelper.c (vm_call_iseq_setup_normal): simple for loop diff --git a/lib/rubygems.rb b/lib/rubygems.rb index 7dea86c3dd..5e106c7976 100644 --- a/lib/rubygems.rb +++ b/lib/rubygems.rb @@ -764,7 +764,7 @@ module Gem # Safely read a file in binary mode on all platforms. def self.read_binary(path) - File.open path, binary_mode do |f| + open path, 'rb+' do |f| f.flock(File::LOCK_EX) f.read end diff --git a/lib/rubygems/commands/install_command.rb b/lib/rubygems/commands/install_command.rb index d2dd7ac920..56ff8fc564 100644 --- a/lib/rubygems/commands/install_command.rb +++ b/lib/rubygems/commands/install_command.rb @@ -200,25 +200,31 @@ to write the specification by hand. For example: req = Gem::Requirement.create(version) - inst = Gem::DependencyInstaller.new options + if options[:ignore_dependencies] + inst = Gem::Installer.new name, options + inst.install + @installed_specs.push(inst.spec) + else + inst = Gem::DependencyInstaller.new options - if options[:explain] - request_set = inst.resolve_dependencies name, req + if options[:explain] + request_set = inst.resolve_dependencies name, req - puts "Gems to install:" + puts "Gems to install:" - request_set.specs.map { |s| s.full_name }.sort.each do |s| - puts " #{s}" - end + request_set.specs.map { |s| s.full_name }.sort.each do |s| + puts " #{s}" + end - return - else - inst.install name, req - end + return + else + inst.install name, req + end - @installed_specs.push(*inst.installed_gems) + @installed_specs.push(*inst.installed_gems) - show_install_errors inst.errors + show_install_errors inst.errors + end end def install_gems # :nodoc: diff --git a/lib/rubygems/installer.rb b/lib/rubygems/installer.rb index f3172752c2..f8eb2c2145 100644 --- a/lib/rubygems/installer.rb +++ b/lib/rubygems/installer.rb @@ -212,6 +212,8 @@ class Gem::Installer def install pre_install_checks + FileUtils.rm_f File.join gem_home, 'specifications', @spec.spec_name + run_pre_install_hooks # Completely remove any previous gem files diff --git a/test/rubygems/test_gem_installer.rb b/test/rubygems/test_gem_installer.rb index 4d13c68505..615a9b57ba 100644 --- a/test/rubygems/test_gem_installer.rb +++ b/test/rubygems/test_gem_installer.rb @@ -645,9 +645,11 @@ gem 'other', version cache_file = File.join @gemhome, 'cache', @spec.file_name stub_exe = File.join @gemhome, 'bin', 'executable' rakefile = File.join gemdir, 'ext', 'a', 'Rakefile' + spec_file = File.join @gemhome, 'specifications', @spec.spec_name Gem.pre_install do |installer| refute_path_exists cache_file, 'cache file must not exist yet' + refute_path_exists spec_file, 'spec file must not exist yet' true end @@ -655,11 +657,13 @@ gem 'other', version assert_path_exists gemdir, 'gem install dir must exist' assert_path_exists rakefile, 'gem executable must exist' refute_path_exists stub_exe, 'gem executable must not exist' + refute_path_exists spec_file, 'spec file must not exist yet' true end Gem.post_install do |installer| assert_path_exists cache_file, 'cache file must exist' + assert_path_exists spec_file, 'spec file must exist' end @newspec = nil -- cgit v1.2.3