Class Gem::Commands::UpdateCommand
In: lib/rubygems/commands/update_command.rb
Parent: Gem::Command

Methods

Included Modules

Gem::InstallUpdateOptions Gem::LocalRemoteOptions Gem::VersionOption

Public Class methods

[Source]

    # File lib/rubygems/commands/update_command.rb, line 15
15:   def initialize
16:     super 'update',
17:           'Update the named gems (or all installed gems) in the local repository',
18:       :generate_rdoc => true, 
19:       :generate_ri => true, 
20:       :force => false, 
21:       :test => false,
22:       :install_dir => Gem.dir
23: 
24:     add_install_update_options
25: 
26:     add_option('--system',
27:                'Update the RubyGems system software') do |value, options|
28:       options[:system] = value
29:     end
30: 
31:     add_local_remote_options
32: 
33:     add_platform_option
34:   end

Public Instance methods

[Source]

     # File lib/rubygems/commands/update_command.rb, line 109
109:   def do_rubygems_update(version)
110:     args = []
111:     args.push '--prefix', Gem.prefix unless Gem.prefix.nil?
112:     args << '--no-rdoc' unless options[:generate_rdoc]
113:     args << '--no-ri' unless options[:generate_ri]
114:     args << '--no-format-executable' if options[:no_format_executable]
115: 
116:     update_dir = File.join Gem.dir, 'gems', "rubygems-update-#{version}"
117: 
118:     success = false
119: 
120:     Dir.chdir update_dir do
121:       say "Installing RubyGems #{version}"
122:       setup_cmd = "#{Gem.ruby} setup.rb #{args.join ' '}"
123: 
124:       # Make sure old rubygems isn't loaded
125:       old = ENV["RUBYOPT"]
126:       ENV.delete("RUBYOPT")
127:       system setup_cmd
128:       ENV["RUBYOPT"] = old if old
129:     end
130:   end

[Source]

     # File lib/rubygems/commands/update_command.rb, line 48
 48:   def execute
 49:     if options[:system] then
 50:       fail "gem update --system is disabled on Debian. RubyGems can be updated using the official Debian repositories by aptitude or apt-get."
 51:     else
 52:       say "Updating installed gems"
 53:     end
 54: 
 55:     hig = {} # highest installed gems
 56: 
 57:     Gem::SourceIndex.from_installed_gems.each do |name, spec|
 58:       if hig[spec.name].nil? or hig[spec.name].version < spec.version then
 59:         hig[spec.name] = spec
 60:       end
 61:     end
 62: 
 63:     pattern = if options[:args].empty? then
 64:                 //
 65:               else
 66:                 Regexp.union(*options[:args])
 67:               end
 68: 
 69:     remote_gemspecs = Gem::SourceInfoCache.search pattern
 70: 
 71:     gems_to_update = which_to_update hig, remote_gemspecs
 72: 
 73:     updated = []
 74: 
 75:     installer = Gem::DependencyInstaller.new options
 76: 
 77:     gems_to_update.uniq.sort.each do |name|
 78:       next if updated.any? { |spec| spec.name == name }
 79: 
 80:       say "Updating #{name}"
 81:       installer.install name
 82: 
 83:       installer.installed_gems.each do |spec|
 84:         updated << spec
 85:         say "Successfully installed #{spec.full_name}"
 86:       end
 87:     end
 88: 
 89:     if gems_to_update.include? "rubygems-update" then
 90:       latest_ruby_gem = remote_gemspecs.select do |s|
 91:         s.name == 'rubygems-update'
 92:       end
 93: 
 94:       latest_ruby_gem = latest_ruby_gem.sort_by { |s| s.version }.last
 95: 
 96:       say "Updating version of RubyGems to #{latest_ruby_gem.version}"
 97:       installed = do_rubygems_update latest_ruby_gem.version
 98: 
 99:       say "RubyGems system software updated" if installed
100:     else
101:       if updated.empty? then
102:         say "Nothing to update"
103:       else
104:         say "Gems updated: #{updated.map { |spec| spec.name }.join ', '}"
105:       end
106:     end
107:   end

[Source]

     # File lib/rubygems/commands/update_command.rb, line 132
132:   def which_to_update(highest_installed_gems, remote_gemspecs)
133:     result = []
134: 
135:     highest_installed_gems.each do |l_name, l_spec|
136:       matching_gems = remote_gemspecs.select do |spec|
137:         spec.name == l_name and Gem.platforms.any? do |platform|
138:           platform == spec.platform
139:         end
140:       end
141: 
142:       highest_remote_gem = matching_gems.sort_by { |spec| spec.version }.last
143: 
144:       if highest_remote_gem and
145:          l_spec.version < highest_remote_gem.version then
146:         result << l_name
147:       end
148:     end
149: 
150:     result
151:   end

[Validate]