| 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: :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
Update the RubyGems software to version.
# 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
# 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
# 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