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: 
23:     add_install_update_options
24: 
25:     add_option('--system',
26:                'Update the RubyGems system software') do |value, options|
27:       options[:system] = value
28:     end
29: 
30:     add_local_remote_options
31: 
32:     add_platform_option
33:   end

Public Instance methods

Update the RubyGems software to version.

[Source]

     # File lib/rubygems/commands/update_command.rb, line 126
126:   def do_rubygems_update(version)
127:     args = []
128:     args.push '--prefix', Gem.prefix unless Gem.prefix.nil?
129:     args << '--no-rdoc' unless options[:generate_rdoc]
130:     args << '--no-ri' unless options[:generate_ri]
131:     args << '--no-format-executable' if options[:no_format_executable]
132: 
133:     update_dir = File.join Gem.dir, 'gems', "rubygems-update-#{version}"
134: 
135:     Dir.chdir update_dir do
136:       say "Installing RubyGems #{version}"
137:       setup_cmd = "#{Gem.ruby} setup.rb #{args.join ' '}"
138: 
139:       # Make sure old rubygems isn't loaded
140:       old = ENV["RUBYOPT"]
141:       ENV.delete("RUBYOPT")
142:       system setup_cmd
143:       ENV["RUBYOPT"] = old if old
144:     end
145:   end

[Source]

     # File lib/rubygems/commands/update_command.rb, line 47
 47:   def execute
 48:     hig = {}
 49: 
 50:     if options[:system] then
 51:       fail "gem update --system is disabled on Debian. RubyGems can be updated using the official Debian repositories by aptitude or apt-get."
 52:     else
 53:       say "Updating installed gems"
 54: 
 55:       hig = {} # highest installed gems
 56: 
 57:       Gem.source_index.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:     end
 63: 
 64:     gems_to_update = which_to_update hig, options[:args]
 65: 
 66:     updated = []
 67: 
 68:     installer = Gem::DependencyInstaller.new options
 69: 
 70:     gems_to_update.uniq.sort.each do |name|
 71:       next if updated.any? { |spec| spec.name == name }
 72:       success = false
 73: 
 74:       say "Updating #{name}"
 75:       begin
 76:         installer.install name
 77:         success = true
 78:       rescue Gem::InstallError => e
 79:         alert_error "Error installing #{name}:\n\t#{e.message}"
 80:         success = false
 81:       end
 82: 
 83:       installer.installed_gems.each do |spec|
 84:         updated << spec
 85:         say "Successfully installed #{spec.full_name}" if success
 86:       end
 87:     end
 88: 
 89:     if gems_to_update.include? "rubygems-update" then
 90:       Gem.source_index.refresh!
 91: 
 92:       update_gems = Gem.source_index.find_name 'rubygems-update'
 93: 
 94:       latest_update_gem = update_gems.sort_by { |s| s.version }.last
 95: 
 96:       say "Updating RubyGems to #{latest_update_gem.version}"
 97:       installed = do_rubygems_update latest_update_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: 
106:         if options[:generate_ri] then
107:           updated.each do |gem|
108:             Gem::DocManager.new(gem, options[:rdoc_args]).generate_ri
109:           end
110: 
111:           Gem::DocManager.update_ri_cache
112:         end
113: 
114:         if options[:generate_rdoc] then
115:           updated.each do |gem|
116:             Gem::DocManager.new(gem, options[:rdoc_args]).generate_rdoc
117:           end
118:         end
119:       end
120:     end
121:   end

[Source]

     # File lib/rubygems/commands/update_command.rb, line 147
147:   def which_to_update(highest_installed_gems, gem_names)
148:     result = []
149: 
150:     highest_installed_gems.each do |l_name, l_spec|
151:       next if not gem_names.empty? and
152:               gem_names.all? { |name| /#{name}/ !~ l_spec.name }
153: 
154:       dependency = Gem::Dependency.new l_spec.name, "> #{l_spec.version}"
155: 
156:       begin
157:         fetcher = Gem::SpecFetcher.fetcher
158:         spec_tuples = fetcher.find_matching dependency
159:       rescue Gem::RemoteFetcher::FetchError => e
160:         raise unless fetcher.warn_legacy e do
161:           require 'rubygems/source_info_cache'
162: 
163:           dependency.name = '' if dependency.name == //
164: 
165:           specs = Gem::SourceInfoCache.search_with_source dependency
166: 
167:           spec_tuples = specs.map do |spec, source_uri|
168:             [[spec.name, spec.version, spec.original_platform], source_uri]
169:           end
170:         end
171:       end
172: 
173:       matching_gems = spec_tuples.select do |(name, version, platform),|
174:         name == l_name and Gem::Platform.match platform
175:       end
176: 
177:       highest_remote_gem = matching_gems.sort_by do |(name, version),|
178:         version
179:       end.last
180: 
181:       if highest_remote_gem and
182:          l_spec.version < highest_remote_gem.first[1] then
183:         result << l_name
184:       end
185:     end
186: 
187:     result
188:   end

[Validate]