From 269503b544247b5b3e30dbe60a0bab4f2ca00e4e Mon Sep 17 00:00:00 2001 From: naruse Date: Sat, 14 Sep 2013 08:59:02 +0000 Subject: Revert r42938 "* lib/rubygems: Update to RubyGems 2.1.3" It breaks build. http://u64.rubyci.org/~chkbuild/ruby-trunk/log/20130913T200302Z.diff.html.gz git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42941 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/rubygems/commands/update_command.rb | 195 ++++++++++++++++++++------------ 1 file changed, 120 insertions(+), 75 deletions(-) (limited to 'lib/rubygems/commands/update_command.rb') diff --git a/lib/rubygems/commands/update_command.rb b/lib/rubygems/commands/update_command.rb index a31de0071a..77bf5edb45 100644 --- a/lib/rubygems/commands/update_command.rb +++ b/lib/rubygems/commands/update_command.rb @@ -52,27 +52,46 @@ class Gem::Commands::UpdateCommand < Gem::Command "--document --no-force --install-dir #{Gem.dir}" end + def description # :nodoc: + <<-EOF +The update command will update your gems to the latest version. + +The update comamnd does not remove the previous version. Use the cleanup +command to remove old versions. + EOF + end + def usage # :nodoc: "#{program_name} GEMNAME [GEMNAME ...]" end + def check_latest_rubygems version # :nodoc: + if Gem.rubygems_version == version then + say "Latest version currently installed. Aborting." + terminate_interaction + end + + options[:user_install] = false + end + + def check_update_arguments # :nodoc: + unless options[:args].empty? then + alert_error "Gem names are not allowed with the --system option" + terminate_interaction 1 + end + end + def execute hig = {} if options[:system] then update_rubygems return - else - say "Updating installed gems" + end - hig = {} # highest installed gems + say "Updating installed gems" - Gem::Specification.each do |spec| - if hig[spec.name].nil? or hig[spec.name].version < spec.version then - hig[spec.name] = spec - end - end - end + hig = highest_installed_gems gems_to_update = which_to_update hig, options[:args].uniq @@ -85,51 +104,65 @@ class Gem::Commands::UpdateCommand < Gem::Command end end - def update_gem name, version = Gem::Requirement.default - return if @updated.any? { |spec| spec.name == name } + def fetch_remote_gems spec # :nodoc: + dependency = Gem::Dependency.new spec.name, "> #{spec.version}" + dependency.prerelease = options[:prerelease] - @installer ||= Gem::DependencyInstaller.new options + fetcher = Gem::SpecFetcher.fetcher - success = false + spec_tuples, _ = fetcher.search_for_dependency dependency - say "Updating #{name}" - begin - @installer.install name, Gem::Requirement.new(version) - success = true - rescue Gem::InstallError => e - alert_error "Error installing #{name}:\n\t#{e.message}" - success = false - end + spec_tuples + end - @installer.installed_gems.each do |spec| - @updated << spec + def highest_installed_gems # :nodoc: + hig = {} # highest installed gems + + Gem::Specification.each do |spec| + if hig[spec.name].nil? or hig[spec.name].version < spec.version then + hig[spec.name] = spec + end end + + hig end - def update_gems gems_to_update - gems_to_update.uniq.sort.each do |(name, version)| - update_gem name, version + def highest_remote_version spec # :nodoc: + spec_tuples = fetch_remote_gems spec + + matching_gems = spec_tuples.select do |g,_| + g.name == spec.name and g.match_platform? end - @updated + highest_remote_gem = matching_gems.sort_by { |g,_| g.version }.last + + highest_remote_gem ||= [Gem::NameTuple.null] + + highest_remote_gem.first.version end - ## - # Update RubyGems software to the latest version. + def install_rubygems version # :nodoc: + args = update_rubygems_arguments - def update_rubygems - unless options[:args].empty? then - alert_error "Gem names are not allowed with the --system option" - terminate_interaction 1 - end + update_dir = File.join Gem.dir, 'gems', "rubygems-update-#{version}" - options[:user_install] = false + Dir.chdir update_dir do + say "Installing RubyGems #{version}" - # TODO: rename version and other variable name conflicts - # TODO: get rid of all this indirection on name and other BS + # Make sure old rubygems isn't loaded + old = ENV["RUBYOPT"] + ENV.delete("RUBYOPT") if old + installed = system Gem.ruby, 'setup.rb', *args + say "RubyGems system software updated" if installed + ENV["RUBYOPT"] = old if old + end + end + def rubygems_target_version version = options[:system] - if version == true then + update_latest = version == true + + if update_latest then version = Gem::Version.new Gem::VERSION requirement = Gem::Requirement.new ">= #{Gem::VERSION}" else @@ -146,46 +179,72 @@ class Gem::Commands::UpdateCommand < Gem::Command } gems_to_update = which_to_update hig, options[:args], :system - name, up_ver = gems_to_update.first - current_ver = Gem.rubygems_version + _, up_ver = gems_to_update.first - target = if options[:system] == true then + target = if update_latest then up_ver else version end - if current_ver == target then - # if options[:system] != true and version == current_ver then - say "Latest version currently installed. Aborting." - terminate_interaction + return target, requirement + end + + def update_gem name, version = Gem::Requirement.default + return if @updated.any? { |spec| spec.name == name } + + @installer ||= Gem::DependencyInstaller.new options + + success = false + + say "Updating #{name}" + begin + @installer.install name, Gem::Requirement.new(version) + success = true + rescue Gem::InstallError => e + alert_error "Error installing #{name}:\n\t#{e.message}" + success = false end - update_gem name, target + @installer.installed_gems.each do |spec| + @updated << spec + end + end + + def update_gems gems_to_update + gems_to_update.uniq.sort.each do |(name, version)| + update_gem name, version + end + + @updated + end + + ## + # Update RubyGems software to the latest version. + + def update_rubygems + check_update_arguments + + version, requirement = rubygems_target_version + + check_latest_rubygems version + + update_gem 'rubygems-update', version installed_gems = Gem::Specification.find_all_by_name 'rubygems-update', requirement version = installed_gems.last.version + install_rubygems version + end + + def update_rubygems_arguments # :nodoc: args = [] args << '--prefix' << Gem.prefix if Gem.prefix # TODO use --document for >= 1.9 , --no-rdoc --no-ri < 1.9 args << '--no-rdoc' unless options[:document].include? 'rdoc' args << '--no-ri' unless options[:document].include? 'ri' args << '--no-format-executable' if options[:no_format_executable] - - update_dir = File.join Gem.dir, 'gems', "rubygems-update-#{version}" - - Dir.chdir update_dir do - say "Installing RubyGems #{version}" - setup_cmd = "#{Gem.ruby} setup.rb #{args.join ' '}" - - # Make sure old rubygems isn't loaded - old = ENV["RUBYOPT"] - ENV.delete("RUBYOPT") if old - installed = system setup_cmd - say "RubyGems system software updated" if installed - ENV["RUBYOPT"] = old if old - end + args end def which_to_update highest_installed_gems, gem_names, system = false @@ -195,21 +254,7 @@ class Gem::Commands::UpdateCommand < Gem::Command next if not gem_names.empty? and gem_names.all? { |name| /#{name}/ !~ l_spec.name } - dependency = Gem::Dependency.new l_spec.name, "> #{l_spec.version}" - dependency.prerelease = options[:prerelease] - - fetcher = Gem::SpecFetcher.fetcher - - spec_tuples, _ = fetcher.search_for_dependency dependency - - matching_gems = spec_tuples.select do |g,_| - g.name == l_name and g.match_platform? - end - - highest_remote_gem = matching_gems.sort_by { |g,_| g.version }.last - - highest_remote_gem ||= [Gem::NameTuple.null] - highest_remote_ver = highest_remote_gem.first.version + highest_remote_ver = highest_remote_version l_spec if system or (l_spec.version < highest_remote_ver) then result << [l_spec.name, [l_spec.version, highest_remote_ver].max] -- cgit v1.2.3