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 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

Public Instance methods

[Source]

    # 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

[Source]

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

[Source]

     # File lib/rubygems/commands/setup_command.rb, line 272
272:   def generate_default_dirs(install_destdir)
273:     prefix = options[:prefix]
274:     site_or_vendor = options[:site_or_vendor]
275: 
276:     if prefix.empty? then
277:       lib_dir = Gem::ConfigMap[site_or_vendor]
278:       bin_dir = Gem::ConfigMap[:bindir]
279:     else
280:       # Apple installed RubyGems into libdir, and RubyGems <= 1.1.0 gets
281:       # confused about installation location, so switch back to
282:       # sitelibdir/vendorlibdir.
283:       if defined?(APPLE_GEM_HOME) and
284:         # just in case Apple and RubyGems don't get this patched up proper.
285:         (prefix == Gem::ConfigMap[:libdir] or
286:          # this one is important
287:          prefix == File.join(Gem::ConfigMap[:libdir], 'ruby')) then
288:          lib_dir = Gem::ConfigMap[site_or_vendor]
289:          bin_dir = Gem::ConfigMap[:bindir]
290:       else
291:         lib_dir = File.join prefix, 'lib'
292:         bin_dir = File.join prefix, 'bin'
293:       end
294:     end
295: 
296:     unless install_destdir.empty? then
297:       lib_dir = File.join install_destdir, lib_dir.gsub(/^[a-zA-Z]:/, '')
298:       bin_dir = File.join install_destdir, bin_dir.gsub(/^[a-zA-Z]:/, '')
299:     end
300: 
301:     [lib_dir, bin_dir]
302:   end

[Source]

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

[Source]

     # File lib/rubygems/commands/setup_command.rb, line 210
210:   def install_lib(lib_dir)
211:     say "Installing RubyGems" if @verbose
212: 
213:     Dir.chdir 'lib' do
214:       lib_files =  Dir[File.join('**', '*rb')]
215: 
216:       # Be sure to include our SSL ca bundles
217:       lib_files += Dir[File.join('**', '*pem')]
218: 
219:       lib_files.each do |lib_file|
220:         dest_file = File.join lib_dir, lib_file
221:         dest_dir = File.dirname dest_file
222:         mkdir_p dest_dir unless File.directory? dest_dir
223: 
224:         install lib_file, dest_file, :mode => 0644
225:       end
226:     end
227:   end

[Source]

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

[Source]

     # File lib/rubygems/commands/setup_command.rb, line 259
259:   def make_destination_dirs(install_destdir)
260:     lib_dir, bin_dir = Gem.default_rubygems_dirs
261: 
262:     unless lib_dir
263:       lib_dir, bin_dir = generate_default_dirs(install_destdir)
264:     end
265: 
266:     mkdir_p lib_dir
267:     mkdir_p bin_dir
268: 
269:     return lib_dir, bin_dir
270:   end

[Source]

     # File lib/rubygems/commands/setup_command.rb, line 304
304:   def remove_old_bin_files(bin_dir)
305:     old_bin_files = {
306:       'gem_mirror' => 'gem mirror',
307:       'gem_server' => 'gem server',
308:       'gemlock' => 'gem lock',
309:       'gemri' => 'ri',
310:       'gemwhich' => 'gem which',
311:       'index_gem_repository.rb' => 'gem generate_index',
312:     }
313: 
314:     old_bin_files.each do |old_bin_file, new_name|
315:       old_bin_path = File.join bin_dir, old_bin_file
316:       next unless File.exist? old_bin_path
317: 
318:       deprecation_message = "`#{old_bin_file}` has been deprecated.  Use `#{new_name}` instead."
319: 
320:       File.open old_bin_path, 'w' do |fp|
321:         fp.write "#!\#{Gem.ruby}\n\nabort \"\#{deprecation_message}\"\n"
322:       end
323: 
324:       next unless Gem.win_platform?
325: 
326:       File.open "#{old_bin_path}.bat", 'w' do |fp|
327:         fp.puts %{@ECHO.#{deprecation_message}}
328:       end
329:     end
330:   end

[Source]

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

[Source]

     # File lib/rubygems/commands/setup_command.rb, line 354
354:   def uninstall_old_gemcutter
355:     require 'rubygems/uninstaller'
356: 
357:     ui = Gem::Uninstaller.new('gemcutter', :all => true, :ignore => true,
358:                               :version => '< 0.4')
359:     ui.uninstall
360:   rescue Gem::InstallError
361:   end

[Validate]