# File rubygems/commands/update_command.rb, line 21
def initialize
super 'update', 'Update installed gems to the latest version',
:document => %w[rdoc ri],
:force => false
add_install_update_options
OptionParser.accept Gem::Version do |value|
Gem::Version.new value
value
end
add_option('--system [VERSION]', Gem::Version,
'Update the RubyGems system software') do |value, options|
value = true unless value
options[:system] = value
end
add_local_remote_options
add_platform_option
add_prerelease_option "as update targets"
@updated = []
@installer = nil
end
# File rubygems/commands/update_command.rb, line 86
def execute
if options[:system] then
update_rubygems
return
end
say "Updating installed gems"
hig = highest_installed_gems
gems_to_update = which_to_update hig, options[:args].uniq
updated = update_gems gems_to_update
updated_names = updated.map { |spec| spec.name }
not_updated_names = options[:args].uniq - updated_names
if updated.empty? then
say "Nothing to update"
else
say "Gems updated: #{updated_names.join(' ')}"
say "Gems already up-to-date: #{not_updated_names.join(' ')}" unless not_updated_names.empty?
end
end
# File rubygems/commands/update_command.rb, line 169
def rubygems_target_version
version = options[:system]
update_latest = version == true
if update_latest then
version = Gem::Version.new Gem::VERSION
requirement = Gem::Requirement.new ">= #{Gem::VERSION}"
else
version = Gem::Version.new version
requirement = Gem::Requirement.new version
end
rubygems_update = Gem::Specification.new
rubygems_update.name = 'rubygems-update'
rubygems_update.version = version
hig = {
'rubygems-update' => rubygems_update
}
gems_to_update = which_to_update hig, options[:args], :system
_, up_ver = gems_to_update.first
target = if update_latest then
up_ver
else
version
end
return target, requirement
end
# File rubygems/commands/update_command.rb, line 201
def update_gem name, version = Gem::Requirement.default
return if @updated.any? { |spec| spec.name == name }
update_options = options.dup
update_options[:prerelease] = version.prerelease?
@installer = Gem::DependencyInstaller.new update_options
say "Updating #{name}"
begin
@installer.install name, Gem::Requirement.new(version)
rescue Gem::InstallError, Gem::DependencyError => e
alert_error "Error installing #{name}:\n\t#{e.message}"
end
@installer.installed_gems.each do |spec|
@updated << spec
end
end
# File rubygems/commands/update_command.rb, line 221
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.
# File rubygems/commands/update_command.rb, line 232
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
# File rubygems/commands/update_command.rb, line 260
def which_to_update highest_installed_gems, gem_names, system = false
result = []
highest_installed_gems.each do |l_name, l_spec|
next if not gem_names.empty? and
gem_names.none? { |name| name == l_spec.name }
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]
end
end
result
end
Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.
If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.
If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.
If you want to help improve the Ruby documentation, please visit Documenting-ruby.org.