Installs RubyGems itself. This command is ordinarily only available from a RubyGems checkout or tarball.
# File lib/rubygems/commands/setup_command.rb, line 9
9: def initialize
10: require 'tmpdir'
11:
12: super 'setup', 'Install RubyGems',
13: :format_executable => true, :rdoc => true, :ri => true,
14: :site_or_vendor => :sitelibdir,
15: :destdir => '', :prefix => ''
16:
17: add_option '--prefix=PREFIX',
18: 'Prefix path for installing RubyGems',
19: 'Will not affect gem repository location' do |prefix, options|
20: options[:prefix] = File.expand_path prefix
21: end
22:
23: add_option '--destdir=DESTDIR',
24: 'Root directory to install RubyGems into',
25: 'Mainly used for packaging RubyGems' do |destdir, options|
26: options[:destdir] = File.expand_path destdir
27: end
28:
29: add_option '--[no-]vendor',
30: 'Install into vendorlibdir not sitelibdir' do |vendor, options|
31: options[:site_or_vendor] = vendor ? :vendorlibdir : :sitelibdir
32: end
33:
34: add_option '--[no-]format-executable',
35: 'Makes `gem` match ruby',
36: 'If ruby is ruby18, gem will be gem18' do |value, options|
37: options[:format_executable] = value
38: end
39:
40: add_option '--[no-]rdoc',
41: 'Generate RDoc documentation for RubyGems' do |value, options|
42: options[:rdoc] = value
43: end
44:
45: add_option '--[no-]ri',
46: 'Generate RI documentation for RubyGems' do |value, options|
47: options[:ri] = value
48: end
49: end
# File lib/rubygems/commands/setup_command.rb, line 51
51: def check_ruby_version
52: required_version = Gem::Requirement.new '>= 1.8.7'
53:
54: unless required_version.satisfied_by? Gem.ruby_version then
55: alert_error "Expected Ruby version #{required_version}, is #{Gem.ruby_version}"
56: terminate_interaction 1
57: end
58: end
# File lib/rubygems/commands/setup_command.rb, line 82
82: def execute
83: @verbose = Gem.configuration.really_verbose
84:
85: install_destdir = options[:destdir]
86:
87: unless install_destdir.empty? then
88: ENV['GEM_HOME'] ||= File.join(install_destdir,
89: Gem.default_dir.gsub(/^[a-zA-Z]:/, ''))
90: end
91:
92: check_ruby_version
93:
94: require 'fileutils'
95: if Gem.configuration.really_verbose then
96: extend FileUtils::Verbose
97: else
98: extend FileUtils
99: end
100:
101: lib_dir, bin_dir = make_destination_dirs install_destdir
102:
103: install_lib lib_dir
104:
105: install_executables bin_dir
106:
107: remove_old_bin_files bin_dir
108:
109: say "RubyGems #{Gem::VERSION} installed"
110:
111: uninstall_old_gemcutter
112:
113: install_rdoc
114:
115: say
116: if @verbose then
117: say "-" * 78
118: say
119: end
120:
121: release_notes = File.join Dir.pwd, 'History.txt'
122:
123: release_notes = if File.exist? release_notes then
124: open release_notes do |io|
125: text = io.gets '==='
126: text << io.gets('===')
127: text[0...3].sub(/^# coding:.*?^=/, '')
128: end
129: else
130: "Oh-no! Unable to find release notes!"
131: end
132:
133: say release_notes
134:
135: say
136: say "-" * 78
137: say
138:
139: say "RubyGems installed the following executables:"
140: say @bin_file_names.map { |name| "\t#{name}\n" }
141: say
142:
143: unless @bin_file_names.grep(/#{File::SEPARATOR}gem$/) then
144: say "If `gem` was installed by a previous RubyGems installation, you may need"
145: say "to remove it by hand."
146: say
147: end
148: end
# File lib/rubygems/commands/setup_command.rb, line 150
150: def install_executables(bin_dir)
151: say "Installing gem executable" if @verbose
152:
153: @bin_file_names = []
154:
155: Dir.chdir 'bin' do
156: bin_files = Dir['*']
157:
158: bin_files.delete 'update_rubygems'
159:
160: bin_files.each do |bin_file|
161: bin_file_formatted = if options[:format_executable] then
162: Gem.default_exec_format % bin_file
163: else
164: bin_file
165: end
166:
167: dest_file = File.join bin_dir, bin_file_formatted
168: bin_tmp_file = File.join Dir.tmpdir, bin_file
169:
170: begin
171: bin = File.readlines bin_file
172: bin[0] = "#!#{Gem.ruby}\n"
173:
174: File.open bin_tmp_file, 'w' do |fp|
175: fp.puts bin.join
176: end
177:
178: install bin_tmp_file, dest_file, :mode => 0755
179: @bin_file_names << dest_file
180: ensure
181: rm bin_tmp_file
182: end
183:
184: next unless Gem.win_platform?
185:
186: begin
187: bin_cmd_file = File.join Dir.tmpdir, "#{bin_file}.bat"
188:
189: File.open bin_cmd_file, 'w' do |file|
190: file.puts @ECHO OFFIF NOT "%~f0" == "~f0" GOTO :WinNT@"#{File.basename(Gem.ruby).chomp('"')}" "#{dest_file}" %1 %2 %3 %4 %5 %6 %7 %8 %9GOTO :EOF:WinNT@"#{File.basename(Gem.ruby).chomp('"')}" "%~dpn0" %*
191: end
192:
193: install bin_cmd_file, "#{dest_file}.bat", :mode => 0755
194: ensure
195: rm bin_cmd_file
196: end
197: end
198: end
199: end
# File lib/rubygems/commands/setup_command.rb, line 208
208: def install_lib(lib_dir)
209: say "Installing RubyGems" if @verbose
210:
211: Dir.chdir 'lib' do
212: lib_files = Dir[File.join('**', '*rb')]
213:
214: lib_files.each do |lib_file|
215: dest_file = File.join lib_dir, lib_file
216: dest_dir = File.dirname dest_file
217: mkdir_p dest_dir unless File.directory? dest_dir
218:
219: install lib_file, dest_file, :mode => 0644
220: end
221: end
222: end
# File lib/rubygems/commands/setup_command.rb, line 224
224: def install_rdoc
225: gem_doc_dir = File.join Gem.dir, 'doc'
226: rubygems_name = "rubygems-#{Gem::VERSION}"
227: rubygems_doc_dir = File.join gem_doc_dir, rubygems_name
228:
229: if File.writable? gem_doc_dir and
230: (not File.exist? rubygems_doc_dir or
231: File.writable? rubygems_doc_dir) then
232: say "Removing old RubyGems RDoc and ri" if @verbose
233: Dir[File.join(Gem.dir, 'doc', 'rubygems-[0-9]*')].each do |dir|
234: rm_rf dir
235: end
236:
237: if options[:ri] then
238: ri_dir = File.join rubygems_doc_dir, 'ri'
239: say "Installing #{rubygems_name} ri into #{ri_dir}" if @verbose
240: run_rdoc '--ri', '--op', ri_dir
241: end
242:
243: if options[:rdoc] then
244: rdoc_dir = File.join rubygems_doc_dir, 'rdoc'
245: say "Installing #{rubygems_name} rdoc into #{rdoc_dir}" if @verbose
246: run_rdoc '--op', rdoc_dir
247: end
248: elsif @verbose then
249: say "Skipping RDoc generation, #{gem_doc_dir} not writable"
250: say "Set the GEM_HOME environment variable if you want RDoc generated"
251: end
252: end
# File lib/rubygems/commands/setup_command.rb, line 254
254: def make_destination_dirs(install_destdir)
255: lib_dir = nil
256: bin_dir = nil
257:
258: prefix = options[:prefix]
259: site_or_vendor = options[:site_or_vendor]
260:
261: if prefix.empty? then
262: lib_dir = Gem::ConfigMap[site_or_vendor]
263: bin_dir = Gem::ConfigMap[:bindir]
264: else
265: # Apple installed RubyGems into libdir, and RubyGems <= 1.1.0 gets
266: # confused about installation location, so switch back to
267: # sitelibdir/vendorlibdir.
268: if defined?(APPLE_GEM_HOME) and
269: # just in case Apple and RubyGems don't get this patched up proper.
270: (prefix == Gem::ConfigMap[:libdir] or
271: # this one is important
272: prefix == File.join(Gem::ConfigMap[:libdir], 'ruby')) then
273: lib_dir = Gem::ConfigMap[site_or_vendor]
274: bin_dir = Gem::ConfigMap[:bindir]
275: else
276: lib_dir = File.join prefix, 'lib'
277: bin_dir = File.join prefix, 'bin'
278: end
279: end
280:
281: unless install_destdir.empty? then
282: lib_dir = File.join install_destdir, lib_dir.gsub(/^[a-zA-Z]:/, '')
283: bin_dir = File.join install_destdir, bin_dir.gsub(/^[a-zA-Z]:/, '')
284: end
285:
286: mkdir_p lib_dir
287: mkdir_p bin_dir
288:
289: return lib_dir, bin_dir
290: end
# File lib/rubygems/commands/setup_command.rb, line 292
292: def remove_old_bin_files(bin_dir)
293: old_bin_files = {
294: 'gem_mirror' => 'gem mirror',
295: 'gem_server' => 'gem server',
296: 'gemlock' => 'gem lock',
297: 'gemri' => 'ri',
298: 'gemwhich' => 'gem which',
299: 'index_gem_repository.rb' => 'gem generate_index',
300: }
301:
302: old_bin_files.each do |old_bin_file, new_name|
303: old_bin_path = File.join bin_dir, old_bin_file
304: next unless File.exist? old_bin_path
305:
306: deprecation_message = "`#{old_bin_file}` has been deprecated. Use `#{new_name}` instead."
307:
308: File.open old_bin_path, 'w' do |fp|
309: fp.write #!#{Gem.ruby}abort "#{deprecation_message}"
310: end
311:
312: next unless Gem.win_platform?
313:
314: File.open "#{old_bin_path}.bat", 'w' do |fp|
315: fp.puts %{@ECHO.#{deprecation_message}}
316: end
317: end
318: end
# File lib/rubygems/commands/setup_command.rb, line 324
324: def run_rdoc(*args)
325: begin
326: gem 'rdoc'
327: rescue Gem::LoadError
328: end
329:
330: require 'rdoc/rdoc'
331:
332: args << '--main' << 'README.rdoc' << '--quiet'
333: args << '.'
334: args << 'README.rdoc' << 'UPGRADING.rdoc'
335: args << 'LICENSE.txt' << 'MIT.txt' << 'History.txt'
336:
337: r = RDoc::RDoc.new
338: r.document args
339: end
# File lib/rubygems/commands/setup_command.rb, line 341
341: def uninstall_old_gemcutter
342: require 'rubygems/uninstaller'
343:
344: ui = Gem::Uninstaller.new('gemcutter', :all => true, :ignore => true,
345: :version => '< 0.4')
346: ui.uninstall
347: rescue Gem::InstallError
348: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.