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

[Source]

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

[Source]

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

[Source]

     # File lib/rubygems/commands/update_command.rb, line 123
123:   def which_to_update(highest_installed_gems, gem_names)
124:     result = []
125: 
126:     highest_installed_gems.each do |l_name, l_spec|
127:       next if not gem_names.empty? and
128:               gem_names.all? { |name| /#{name}/ !~ l_spec.name }
129: 
130:       dependency = Gem::Dependency.new l_spec.name, "> #{l_spec.version}"
131: 
132:       begin
133:         fetcher = Gem::SpecFetcher.fetcher
134:         spec_tuples = fetcher.find_matching dependency
135:       rescue Gem::RemoteFetcher::FetchError => e
136:         raise unless fetcher.warn_legacy e do
137:           require 'rubygems/source_info_cache'
138: 
139:           dependency.name = '' if dependency.name == //
140: 
141:           specs = Gem::SourceInfoCache.search_with_source dependency
142: 
143:           spec_tuples = specs.map do |spec, source_uri|
144:             [[spec.name, spec.version, spec.original_platform], source_uri]
145:           end
146:         end
147:       end
148: 
149:       matching_gems = spec_tuples.select do |(name, version, platform),|
150:         name == l_name and Gem::Platform.match platform
151:       end
152: 
153:       highest_remote_gem = matching_gems.sort_by do |(name, version),|
154:         version
155:       end.last
156: 
157:       if highest_remote_gem and
158:          l_spec.version < highest_remote_gem.first[1] then
159:         result << l_name
160:       end
161:     end
162: 
163:     result
164:   end

[Validate]