summaryrefslogtreecommitdiff
path: root/lib/rubygems/commands/update_command.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rubygems/commands/update_command.rb')
-rw-r--r--lib/rubygems/commands/update_command.rb137
1 files changed, 85 insertions, 52 deletions
diff --git a/lib/rubygems/commands/update_command.rb b/lib/rubygems/commands/update_command.rb
index b2f69a5b52..b7c65eb2a4 100644
--- a/lib/rubygems/commands/update_command.rb
+++ b/lib/rubygems/commands/update_command.rb
@@ -27,8 +27,16 @@ class Gem::Commands::UpdateCommand < Gem::Command
add_install_update_options
- add_option('--system',
+ 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
@@ -50,33 +58,13 @@ class Gem::Commands::UpdateCommand < Gem::Command
end
def execute
+ @installer = Gem::DependencyInstaller.new options
+ @updated = []
+
hig = {}
if options[:system] then
- say "Updating RubyGems"
-
- unless options[:args].empty? then
- raise "No gem names are allowed with the --system option"
- end
-
- rubygems_update = Gem::Specification.new
- rubygems_update.name = 'rubygems-update'
- rubygems_update.version = Gem::Version.new Gem::VERSION
- hig['rubygems-update'] = rubygems_update
-
- options[:user_install] = false
-
- Gem.source_index.refresh!
-
- update_gems = Gem.source_index.find_name 'rubygems-update'
-
- latest_update_gem = update_gems.sort_by { |s| s.version }.last
-
- say "Updating RubyGems to #{latest_update_gem.version}"
- installed = do_rubygems_update latest_update_gem.version
-
- say "RubyGems system software updated" if installed
-
+ update_rubygems
return
else
say "Updating installed gems"
@@ -92,28 +80,7 @@ class Gem::Commands::UpdateCommand < Gem::Command
gems_to_update = which_to_update hig, options[:args]
- updated = []
-
- installer = Gem::DependencyInstaller.new options
-
- gems_to_update.uniq.sort.each do |name|
- next if updated.any? { |spec| spec.name == name }
- success = false
-
- say "Updating #{name}"
- begin
- installer.install name
- success = true
- rescue Gem::InstallError => e
- alert_error "Error installing #{name}:\n\t#{e.message}"
- success = false
- end
-
- installer.installed_gems.each do |spec|
- updated << spec
- say "Successfully installed #{spec.full_name}" if success
- end
- end
+ updated = update_gems gems_to_update
if updated.empty? then
say "Nothing to update"
@@ -136,12 +103,77 @@ class Gem::Commands::UpdateCommand < Gem::Command
end
end
+ def update_gem name, version = Gem::Requirement.default
+ return if @updated.any? { |spec| spec.name == name }
+ success = false
+
+ say "Updating #{name}"
+ begin
+ @installer.install name, version
+ success = true
+ rescue Gem::InstallError => e
+ alert_error "Error installing #{name}:\n\t#{e.message}"
+ success = false
+ end
+
+ @installer.installed_gems.each do |spec|
+ @updated << spec
+ say "Successfully installed #{spec.full_name}" if success
+ end
+ end
+
+ def update_gems gems_to_update
+ gems_to_update.uniq.sort.each do |name|
+ update_gem name
+ end
+
+ @updated
+ end
+
##
- # Update the RubyGems software to +version+.
+ # Update RubyGems software to the latest version.
+
+ def update_rubygems
+ unless options[:args].empty? then
+ alert_error "Gem names are not allowed with the --system option"
+ terminate_interaction 1
+ end
+
+ options[:user_install] = false
+
+ version = options[:system]
+ if version == true 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]
+
+ if gems_to_update.empty? then
+ say "Latest version currently installed. Aborting."
+ terminate_interaction
+ end
+
+ update_gem gems_to_update.first, requirement
+
+ Gem.source_index.refresh!
+
+ installed_gems = Gem.source_index.find_name 'rubygems-update', requirement
+ version = installed_gems.last.version
- def do_rubygems_update(version)
args = []
- args.push '--prefix', Gem.prefix unless Gem.prefix.nil?
+ args << '--prefix' << Gem.prefix if Gem.prefix
args << '--no-rdoc' unless options[:generate_rdoc]
args << '--no-ri' unless options[:generate_ri]
args << '--no-format-executable' if options[:no_format_executable]
@@ -154,8 +186,9 @@ class Gem::Commands::UpdateCommand < Gem::Command
# Make sure old rubygems isn't loaded
old = ENV["RUBYOPT"]
- ENV.delete("RUBYOPT")
- system setup_cmd
+ ENV.delete("RUBYOPT") if old
+ installed = system setup_cmd
+ say "RubyGems system software updated" if installed
ENV["RUBYOPT"] = old if old
end
end