| Class | Gem::Commands::UpdateCommand |
| In: |
lib/rubygems/commands/update_command.rb
|
| Parent: | Gem::Command |
# 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:
22: add_install_update_options
23:
24: OptionParser.accept Gem::Version do |value|
25: Gem::Version.new value
26:
27: value
28: end
29:
30: add_option('--system [VERSION]', Gem::Version,
31: 'Update the RubyGems system software') do |value, options|
32: value = true unless value
33:
34: options[:system] = value
35: end
36:
37: add_local_remote_options
38: add_platform_option
39: add_prerelease_option "as update targets"
40: end
# File lib/rubygems/commands/update_command.rb, line 54
54: def execute
55: @installer = Gem::DependencyInstaller.new options
56: @updated = []
57:
58: hig = {}
59:
60: if options[:system] then
61: update_rubygems
62: return
63: else
64: say "Updating installed gems"
65:
66: hig = {} # highest installed gems
67:
68: Gem::Specification.each do |spec|
69: if hig[spec.name].nil? or hig[spec.name].version < spec.version then
70: hig[spec.name] = spec
71: end
72: end
73: end
74:
75: gems_to_update = which_to_update hig, options[:args].uniq
76:
77: updated = update_gems gems_to_update
78:
79: if updated.empty? then
80: say "Nothing to update"
81: else
82: say "Gems updated: #{updated.map { |spec| spec.name }.join ', '}"
83:
84: if options[:generate_ri] then
85: updated.each do |gem|
86: Gem::DocManager.new(gem, options[:rdoc_args]).generate_ri
87: end
88:
89: Gem::DocManager.update_ri_cache
90: end
91:
92: if options[:generate_rdoc] then
93: updated.each do |gem|
94: Gem::DocManager.new(gem, options[:rdoc_args]).generate_rdoc
95: end
96: end
97: end
98: end
# File lib/rubygems/commands/update_command.rb, line 100
100: def update_gem name, version = Gem::Requirement.default
101: return if @updated.any? { |spec| spec.name == name }
102: success = false
103:
104: say "Updating #{name}"
105: begin
106: @installer.install name, version
107: success = true
108: rescue Gem::InstallError => e
109: alert_error "Error installing #{name}:\n\t#{e.message}"
110: success = false
111: end
112:
113: @installer.installed_gems.each do |spec|
114: @updated << spec
115: say "Successfully installed #{spec.full_name}" if success
116: end
117: end
# File lib/rubygems/commands/update_command.rb, line 119
119: def update_gems gems_to_update
120: gems_to_update.uniq.sort.each do |(name, version)|
121: update_gem name, version
122: end
123:
124: @updated
125: end
Update RubyGems software to the latest version.
# File lib/rubygems/commands/update_command.rb, line 130
130: def update_rubygems
131: if ENV.include?('REALLY_GEM_UPDATE_SYSTEM')
132: say "Updating RubyGems"
133: else
134: alert_error "gem update --system is disabled on Debian, because it will overwrite the content of the rubygems Debian package, and might break your Debian system in subtle ways. The Debian-supported way to update rubygems is through apt-get, using Debian official repositories.\nIf you really know what you are doing, you can still update rubygems by setting the REALLY_GEM_UPDATE_SYSTEM environment variable, but please remember that this is completely unsupported by Debian."
135: terminate_interaction 1
136: end
137: unless options[:args].empty? then
138: alert_error "Gem names are not allowed with the --system option"
139: terminate_interaction 1
140: end
141:
142: options[:user_install] = false
143:
144: # TODO: rename version and other variable name conflicts
145: # TODO: get rid of all this indirection on name and other BS
146:
147: version = options[:system]
148: if version == true then
149: version = Gem::Version.new Gem::VERSION
150: requirement = Gem::Requirement.new ">= #{Gem::VERSION}"
151: else
152: version = Gem::Version.new version
153: requirement = Gem::Requirement.new version
154: end
155:
156: rubygems_update = Gem::Specification.new
157: rubygems_update.name = 'rubygems-update'
158: rubygems_update.version = version
159:
160: hig = {
161: 'rubygems-update' => rubygems_update
162: }
163:
164: gems_to_update = which_to_update hig, options[:args], :system
165: name, up_ver = gems_to_update.first
166: current_ver = Gem::Version.new Gem::VERSION
167:
168: target = if options[:system] == true then
169: up_ver
170: else
171: version
172: end
173:
174: if current_ver == target then
175: # if options[:system] != true and version == current_ver then
176: say "Latest version currently installed. Aborting."
177: terminate_interaction
178: end
179:
180: update_gem name, target
181:
182: installed_gems = Gem::Specification.find_all_by_name 'rubygems-update', requirement
183: version = installed_gems.last.version
184:
185: args = []
186: args << '--prefix' << Gem.prefix if Gem.prefix
187: args << '--no-rdoc' unless options[:generate_rdoc]
188: args << '--no-ri' unless options[:generate_ri]
189: args << '--no-format-executable' if options[:no_format_executable]
190:
191: update_dir = File.join Gem.dir, 'gems', "rubygems-update-#{version}"
192:
193: Dir.chdir update_dir do
194: say "Installing RubyGems #{version}"
195: setup_cmd = "#{Gem.ruby} setup.rb #{args.join ' '}"
196:
197: # Make sure old rubygems isn't loaded
198: old = ENV["RUBYOPT"]
199: ENV.delete("RUBYOPT") if old
200: installed = system setup_cmd
201: say "RubyGems system software updated" if installed
202: ENV["RUBYOPT"] = old if old
203: end
204: end
# File lib/rubygems/commands/update_command.rb, line 206
206: def which_to_update highest_installed_gems, gem_names, system = false
207: result = []
208:
209: highest_installed_gems.each do |l_name, l_spec|
210: next if not gem_names.empty? and
211: gem_names.all? { |name| /#{name}/ !~ l_spec.name }
212:
213: dependency = Gem::Dependency.new l_spec.name, "> #{l_spec.version}"
214:
215: fetcher = Gem::SpecFetcher.fetcher
216: spec_tuples = fetcher.find_matching dependency
217:
218: matching_gems = spec_tuples.select do |(name, _, platform),|
219: name == l_name and Gem::Platform.match platform
220: end
221:
222: highest_remote_gem = matching_gems.sort_by do |(_, version),|
223: version
224: end.last
225:
226: highest_remote_gem ||= [[nil, Gem::Version.new(0), nil]] # "null" object
227: highest_remote_ver = highest_remote_gem.first[1]
228:
229: if system or (l_spec.version < highest_remote_ver) then
230: result << [l_spec.name, [l_spec.version, highest_remote_ver].max]
231: end
232: end
233:
234: result
235: end