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.rb195
1 files changed, 75 insertions, 120 deletions
diff --git a/lib/rubygems/commands/update_command.rb b/lib/rubygems/commands/update_command.rb
index 77bf5edb45..a31de0071a 100644
--- a/lib/rubygems/commands/update_command.rb
+++ b/lib/rubygems/commands/update_command.rb
@@ -52,46 +52,27 @@ 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
- end
+ else
+ say "Updating installed gems"
- say "Updating installed gems"
+ hig = {} # highest installed gems
- 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
+ end
gems_to_update = which_to_update hig, options[:args].uniq
@@ -104,65 +85,51 @@ command to remove old versions.
end
end
- def fetch_remote_gems spec # :nodoc:
- dependency = Gem::Dependency.new spec.name, "> #{spec.version}"
- dependency.prerelease = options[:prerelease]
-
- fetcher = Gem::SpecFetcher.fetcher
-
- spec_tuples, _ = fetcher.search_for_dependency dependency
+ def update_gem name, version = Gem::Requirement.default
+ return if @updated.any? { |spec| spec.name == name }
- spec_tuples
- end
+ @installer ||= Gem::DependencyInstaller.new options
- def highest_installed_gems # :nodoc:
- hig = {} # highest installed gems
+ success = false
- Gem::Specification.each do |spec|
- if hig[spec.name].nil? or hig[spec.name].version < spec.version then
- hig[spec.name] = spec
- end
+ 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
- hig
+ @installer.installed_gems.each do |spec|
+ @updated << spec
+ end
end
- 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?
+ def update_gems gems_to_update
+ gems_to_update.uniq.sort.each do |(name, version)|
+ update_gem name, version
end
- highest_remote_gem = matching_gems.sort_by { |g,_| g.version }.last
-
- highest_remote_gem ||= [Gem::NameTuple.null]
-
- highest_remote_gem.first.version
+ @updated
end
- def install_rubygems version # :nodoc:
- args = update_rubygems_arguments
+ ##
+ # Update RubyGems software to the latest version.
- update_dir = File.join Gem.dir, 'gems', "rubygems-update-#{version}"
+ def update_rubygems
+ unless options[:args].empty? then
+ alert_error "Gem names are not allowed with the --system option"
+ terminate_interaction 1
+ end
- Dir.chdir update_dir do
- say "Installing RubyGems #{version}"
+ options[:user_install] = false
- # 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
+ # TODO: rename version and other variable name conflicts
+ # TODO: get rid of all this indirection on name and other BS
- def rubygems_target_version
version = options[:system]
- update_latest = version == true
-
- if update_latest then
+ if version == true then
version = Gem::Version.new Gem::VERSION
requirement = Gem::Requirement.new ">= #{Gem::VERSION}"
else
@@ -179,72 +146,46 @@ command to remove old versions.
}
gems_to_update = which_to_update hig, options[:args], :system
- _, up_ver = gems_to_update.first
+ name, up_ver = gems_to_update.first
+ current_ver = Gem.rubygems_version
- target = if update_latest then
+ target = if options[:system] == true then
up_ver
else
version
end
- 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
-
- @installer.installed_gems.each do |spec|
- @updated << spec
+ if current_ver == target then
+ # if options[:system] != true and version == current_ver then
+ say "Latest version currently installed. Aborting."
+ terminate_interaction
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
+ update_gem name, target
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]
- args
+
+ 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
end
def which_to_update highest_installed_gems, gem_names, system = false
@@ -254,7 +195,21 @@ command to remove old versions.
next if not gem_names.empty? and
gem_names.all? { |name| /#{name}/ !~ l_spec.name }
- highest_remote_ver = highest_remote_version l_spec
+ 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
if system or (l_spec.version < highest_remote_ver) then
result << [l_spec.name, [l_spec.version, highest_remote_ver].max]