Class Gem::Commands::SetupCommand
In: lib/rubygems/commands/setup_command.rb
Parent: Gem::Command

Installs RubyGems itself. This command is ordinarily only available from a RubyGems checkout or tarball.

Methods

Public Class methods

[Source]

    # File lib/rubygems/commands/setup_command.rb, line 13
13:   def initialize
14:     super 'setup', 'Install RubyGems',
15:           :format_executable => true, :rdoc => true, :ri => true,
16:           :site_or_vendor => :sitelibdir,
17:           :destdir => '', :prefix => ''
18: 
19:     add_option '--prefix=PREFIX',
20:                'Prefix path for installing RubyGems',
21:                'Will not affect gem repository location' do |prefix, options|
22:       options[:prefix] = File.expand_path prefix
23:     end
24: 
25:     add_option '--destdir=DESTDIR',
26:                'Root directory to install RubyGems into',
27:                'Mainly used for packaging RubyGems' do |destdir, options|
28:       options[:destdir] = File.expand_path destdir
29:     end
30: 
31:     add_option '--[no-]vendor',
32:                'Install into vendorlibdir not sitelibdir',
33:                '(Requires Ruby 1.8.7)' do |vendor, options|
34:       if vendor and Gem.ruby_version < Gem::Version.new('1.8.7') then
35:         raise OptionParser::InvalidOption,
36:               "requires ruby 1.8.7+ (you have #{Gem.ruby_version})"
37:       end
38: 
39:       options[:site_or_vendor] = vendor ? :vendorlibdir : :sitelibdir
40:     end
41: 
42:     add_option '--[no-]format-executable',
43:                'Makes `gem` match ruby',
44:                'If ruby is ruby18, gem will be gem18' do |value, options|
45:       options[:format_executable] = value
46:     end
47: 
48:     add_option '--[no-]rdoc',
49:                'Generate RDoc documentation for RubyGems' do |value, options|
50:       options[:rdoc] = value
51:     end
52: 
53:     add_option '--[no-]ri',
54:                'Generate RI documentation for RubyGems' do |value, options|
55:       options[:ri] = value
56:     end
57:   end

Public Instance methods

[Source]

    # File lib/rubygems/commands/setup_command.rb, line 59
59:   def check_ruby_version
60:     required_version = Gem::Version.new '1.8.3'
61: 
62:     unless Gem.ruby_version > required_version then
63:       alert_error "Ruby version > #{required_version} required, is #{Gem.ruby_version}"
64:       terminate_interaction 1
65:     end
66:   end

[Source]

     # File lib/rubygems/commands/setup_command.rb, line 91
 91:   def execute
 92:     install_destdir = options[:destdir]
 93: 
 94:     unless install_destdir.empty? then
 95:       ENV['GEM_HOME'] ||= File.join(install_destdir,
 96:                                     Gem.default_dir.gsub(/^[a-zA-Z]:/, ''))
 97:     end
 98: 
 99:     check_ruby_version
100: 
101:     if Gem.configuration.really_verbose then
102:       extend FileUtils::Verbose
103:     else
104:       extend FileUtils
105:     end
106: 
107:     lib_dir, bin_dir = make_destination_dirs install_destdir
108: 
109:     install_lib lib_dir
110: 
111:     install_executables bin_dir
112: 
113:     remove_old_bin_files bin_dir
114: 
115:     remove_source_caches install_destdir
116: 
117:     install_rdoc
118: 
119:     say
120:     say "-" * 78
121:     say
122: 
123:     release_notes = File.join Dir.pwd, 'doc', 'release_notes',
124:                               "rel_#{Gem::RubyGemsVersion.gsub '.', '_'}.rdoc"
125: 
126:     if File.exist? release_notes then
127:       say File.read(release_notes)
128:     else
129:       say "Oh-no! Unable to find release notes!"
130:       say "Looked in: #{release_notes}" if Gem.configuration.really_verbose
131:     end
132: 
133:     say
134:     say "-" * 78
135:     say
136: 
137:     say "RubyGems installed the following executables:"
138:     say @bin_file_names.map { |name| "\t#{name}\n" }
139:     say
140: 
141:     unless @bin_file_names.grep(/#{File::SEPARATOR}gem$/) then
142:       say "If `gem` was installed by a previous RubyGems installation, you may need"
143:       say "to remove it by hand."
144:       say
145:     end
146:   end

[Source]

     # File lib/rubygems/commands/setup_command.rb, line 148
148:   def install_executables(bin_dir)
149:     say "Installing gem executable"
150: 
151:     @bin_file_names = []
152: 
153:     Dir.chdir 'bin' do
154:       bin_files = Dir['*']
155: 
156:       bin_files.delete 'update_rubygems'
157: 
158:       bin_files.each do |bin_file|
159:         bin_file_formatted = if options[:format_executable] then
160:                                Gem.default_exec_format % bin_file
161:                              else
162:                                bin_file
163:                              end
164: 
165:         dest_file = File.join bin_dir, bin_file_formatted
166:         bin_tmp_file = File.join Dir.tmpdir, bin_file
167: 
168:         begin
169:           bin = File.readlines bin_file
170:           bin[0] = "#!#{Gem.ruby}\n"
171: 
172:           File.open bin_tmp_file, 'w' do |fp|
173:             fp.puts bin.join
174:           end
175: 
176:           install bin_tmp_file, dest_file, :mode => 0755
177:           @bin_file_names << dest_file
178:         ensure
179:           rm bin_tmp_file
180:         end
181: 
182:         next unless Gem.win_platform?
183: 
184:         begin
185:           bin_cmd_file = File.join Dir.tmpdir, "#{bin_file}.bat"
186: 
187:           File.open bin_cmd_file, 'w' do |file|
188:             file.puts "@ECHO OFF\nIF NOT \"%~f0\" == \"~f0\" GOTO :WinNT\n@\"\#{File.basename(Gem.ruby).chomp('\"')}\" \"\#{dest_file}\" %1 %2 %3 %4 %5 %6 %7 %8 %9\nGOTO :EOF\n:WinNT\n@\"\#{File.basename(Gem.ruby).chomp('\"')}\" \"%~dpn0\" %*\n"
189:           end
190: 
191:           install bin_cmd_file, "#{dest_file}.bat", :mode => 0755
192:         ensure
193:           rm bin_cmd_file
194:         end
195:       end
196:     end
197:   end

[Source]

     # File lib/rubygems/commands/setup_command.rb, line 207
207:   def install_lib(lib_dir)
208:     say "Installing RubyGems"
209: 
210:     Dir.chdir 'lib' do
211:       lib_files = Dir[File.join('**', '*rb')]
212: 
213:       lib_files.each do |lib_file|
214:         dest_file = File.join lib_dir, lib_file
215:         dest_dir = File.dirname dest_file
216:         mkdir_p dest_dir unless File.directory? dest_dir
217: 
218:         install lib_file, dest_file, :mode => 0644
219:       end
220:     end
221:   end

[Source]

     # File lib/rubygems/commands/setup_command.rb, line 223
223:   def install_rdoc
224:     gem_doc_dir = File.join Gem.dir, 'doc'
225:     rubygems_name = "rubygems-#{Gem::RubyGemsVersion}"
226:     rubygems_doc_dir = File.join gem_doc_dir, rubygems_name
227: 
228:     if File.writable? gem_doc_dir and
229:        (not File.exist? rubygems_doc_dir or
230:         File.writable? rubygems_doc_dir) then
231:       say "Removing old RubyGems RDoc and ri"
232:       Dir[File.join(Gem.dir, 'doc', 'rubygems-[0-9]*')].each do |dir|
233:         rm_rf dir
234:       end
235: 
236:       if options[:ri] then
237:         ri_dir = File.join rubygems_doc_dir, 'ri'
238:         say "Installing #{rubygems_name} ri into #{ri_dir}"
239:         run_rdoc '--ri', '--op', ri_dir
240:       end
241: 
242:       if options[:rdoc] then
243:         rdoc_dir = File.join rubygems_doc_dir, 'rdoc'
244:         say "Installing #{rubygems_name} rdoc into #{rdoc_dir}"
245:         run_rdoc '--op', rdoc_dir
246:       end
247:     else
248:       say "Skipping RDoc generation, #{gem_doc_dir} not writable"
249:       say "Set the GEM_HOME environment variable if you want RDoc generated"
250:     end
251:   end

[Source]

     # File lib/rubygems/commands/setup_command.rb, line 253
253:   def make_destination_dirs(install_destdir)
254:     lib_dir = nil
255:     bin_dir = nil
256: 
257:     prefix = options[:prefix]
258:     site_or_vendor = options[:site_or_vendor]
259: 
260:     if prefix.empty? then
261:       lib_dir = Gem::ConfigMap[site_or_vendor]
262:       bin_dir = Gem::ConfigMap[:bindir]
263:     else
264:       # Apple installed RubyGems into libdir, and RubyGems <= 1.1.0 gets
265:       # confused about installation location, so switch back to
266:       # sitelibdir/vendorlibdir.
267:       if defined?(APPLE_GEM_HOME) and
268:         # just in case Apple and RubyGems don't get this patched up proper.
269:         (prefix == Gem::ConfigMap[:libdir] or
270:          # this one is important
271:          prefix == File.join(Gem::ConfigMap[:libdir], 'ruby')) then
272:          lib_dir = Gem::ConfigMap[site_or_vendor]
273:          bin_dir = Gem::ConfigMap[:bindir]
274:       else
275:         lib_dir = File.join prefix, 'lib'
276:         bin_dir = File.join prefix, 'bin'
277:       end
278:     end
279: 
280:     unless install_destdir.empty? then
281:       lib_dir = File.join install_destdir, lib_dir.gsub(/^[a-zA-Z]:/, '')
282:       bin_dir = File.join install_destdir, bin_dir.gsub(/^[a-zA-Z]:/, '')
283:     end
284: 
285:     mkdir_p lib_dir
286:     mkdir_p bin_dir
287: 
288:     return lib_dir, bin_dir
289:   end

[Source]

     # File lib/rubygems/commands/setup_command.rb, line 291
291:   def remove_old_bin_files(bin_dir)
292:     old_bin_files = {
293:       'gem_mirror' => 'gem mirror',
294:       'gem_server' => 'gem server',
295:       'gemlock' => 'gem lock',
296:       'gemri' => 'ri',
297:       'gemwhich' => 'gem which',
298:       'index_gem_repository.rb' => 'gem generate_index',
299:     }
300: 
301:     old_bin_files.each do |old_bin_file, new_name|
302:       old_bin_path = File.join bin_dir, old_bin_file
303:       next unless File.exist? old_bin_path
304: 
305:       deprecation_message = "`#{old_bin_file}` has been deprecated.  Use `#{new_name}` instead."
306: 
307:       File.open old_bin_path, 'w' do |fp|
308:         fp.write "#!\#{Gem.ruby}\n\nabort \"\#{deprecation_message}\"\n"
309:       end
310: 
311:       next unless Gem.win_platform?
312: 
313:       File.open "#{old_bin_path}.bat", 'w' do |fp|
314:         fp.puts %{@ECHO.#{deprecation_message}}
315:       end
316:     end
317:   end

[Source]

     # File lib/rubygems/commands/setup_command.rb, line 324
324:   def remove_source_caches(install_destdir)
325:     if install_destdir.empty?
326:       require 'rubygems/source_info_cache'
327: 
328:       user_cache_file = File.join(install_destdir,
329:                                   Gem::SourceInfoCache.user_cache_file)
330:       system_cache_file = File.join(install_destdir,
331:                                     Gem::SourceInfoCache.system_cache_file)
332: 
333:       say "Removing old source_cache files"
334:       rm_f user_cache_file if File.writable? File.dirname(user_cache_file)
335:       rm_f system_cache_file if File.writable? File.dirname(system_cache_file)
336:     end
337:   end

[Source]

     # File lib/rubygems/commands/setup_command.rb, line 339
339:   def run_rdoc(*args)
340:     begin
341:       gem 'rdoc'
342:     rescue Gem::LoadError
343:     end
344: 
345:     require 'rdoc/rdoc'
346: 
347:     args << '--quiet'
348:     args << '--main' << 'README'
349:     args << '.' << 'README' << 'LICENSE.txt' << 'GPL.txt'
350: 
351:     r = RDoc::RDoc.new
352:     r.document args
353:   end

[Validate]