| 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.
# 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
# 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
# File lib/rubygems/commands/setup_command.rb, line 91
91: def execute
92: @verbose = Gem.configuration.really_verbose
93:
94: install_destdir = options[:destdir]
95:
96: unless install_destdir.empty? then
97: ENV['GEM_HOME'] ||= File.join(install_destdir,
98: Gem.default_dir.gsub(/^[a-zA-Z]:/, ''))
99: end
100:
101: check_ruby_version
102:
103: if Gem.configuration.really_verbose then
104: extend FileUtils::Verbose
105: else
106: extend FileUtils
107: end
108:
109: lib_dir, bin_dir = make_destination_dirs install_destdir
110:
111: install_lib lib_dir
112:
113: install_executables bin_dir
114:
115: remove_old_bin_files bin_dir
116:
117: remove_source_caches install_destdir
118:
119: say "RubyGems #{Gem::VERSION} installed"
120:
121: install_rdoc
122:
123: say
124: if @verbose then
125: say "-" * 78
126: say
127: end
128:
129: release_notes = File.join Dir.pwd, 'History.txt'
130:
131: release_notes = if File.exist? release_notes then
132: open release_notes do |io|
133: text = io.gets '==='
134: text << io.gets('===')
135: text[0...-3]
136: end
137: else
138: "Oh-no! Unable to find release notes!"
139: end
140:
141: say release_notes
142:
143: say
144: say "-" * 78
145: say
146:
147: say "RubyGems installed the following executables:"
148: say @bin_file_names.map { |name| "\t#{name}\n" }
149: say
150:
151: unless @bin_file_names.grep(/#{File::SEPARATOR}gem$/) then
152: say "If `gem` was installed by a previous RubyGems installation, you may need"
153: say "to remove it by hand."
154: say
155: end
156: end
# File lib/rubygems/commands/setup_command.rb, line 158
158: def install_executables(bin_dir)
159: say "Installing gem executable" if @verbose
160:
161: @bin_file_names = []
162:
163: Dir.chdir 'bin' do
164: bin_files = Dir['*']
165:
166: bin_files.delete 'update_rubygems'
167:
168: bin_files.each do |bin_file|
169: bin_file_formatted = if options[:format_executable] then
170: Gem.default_exec_format % bin_file
171: else
172: bin_file
173: end
174:
175: dest_file = File.join bin_dir, bin_file_formatted
176: bin_tmp_file = File.join Dir.tmpdir, bin_file
177:
178: begin
179: bin = File.readlines bin_file
180: bin[0] = "#!#{Gem.ruby}\n"
181:
182: File.open bin_tmp_file, 'w' do |fp|
183: fp.puts bin.join
184: end
185:
186: install bin_tmp_file, dest_file, :mode => 0755
187: @bin_file_names << dest_file
188: ensure
189: rm bin_tmp_file
190: end
191:
192: next unless Gem.win_platform?
193:
194: begin
195: bin_cmd_file = File.join Dir.tmpdir, "#{bin_file}.bat"
196:
197: File.open bin_cmd_file, 'w' do |file|
198: 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"
199: end
200:
201: install bin_cmd_file, "#{dest_file}.bat", :mode => 0755
202: ensure
203: rm bin_cmd_file
204: end
205: end
206: end
207: end
# File lib/rubygems/commands/setup_command.rb, line 217
217: def install_lib(lib_dir)
218: say "Installing RubyGems" if @verbose
219:
220: Dir.chdir 'lib' do
221: lib_files = Dir[File.join('**', '*rb')]
222:
223: lib_files.each do |lib_file|
224: dest_file = File.join lib_dir, lib_file
225: dest_dir = File.dirname dest_file
226: mkdir_p dest_dir unless File.directory? dest_dir
227:
228: install lib_file, dest_file, :mode => 0644
229: end
230: end
231: end
# File lib/rubygems/commands/setup_command.rb, line 233
233: def install_rdoc
234: gem_doc_dir = File.join Gem.dir, 'doc'
235: rubygems_name = "rubygems-#{Gem::RubyGemsVersion}"
236: rubygems_doc_dir = File.join gem_doc_dir, rubygems_name
237:
238: if File.writable? gem_doc_dir and
239: (not File.exist? rubygems_doc_dir or
240: File.writable? rubygems_doc_dir) then
241: say "Removing old RubyGems RDoc and ri" if @verbose
242: Dir[File.join(Gem.dir, 'doc', 'rubygems-[0-9]*')].each do |dir|
243: rm_rf dir
244: end
245:
246: if options[:ri] then
247: ri_dir = File.join rubygems_doc_dir, 'ri'
248: say "Installing #{rubygems_name} ri into #{ri_dir}" if @verbose
249: run_rdoc '--ri', '--op', ri_dir
250: end
251:
252: if options[:rdoc] then
253: rdoc_dir = File.join rubygems_doc_dir, 'rdoc'
254: say "Installing #{rubygems_name} rdoc into #{rdoc_dir}" if @verbose
255: run_rdoc '--op', rdoc_dir
256: end
257: elsif @verbose then
258: say "Skipping RDoc generation, #{gem_doc_dir} not writable"
259: say "Set the GEM_HOME environment variable if you want RDoc generated"
260: end
261: end
# File lib/rubygems/commands/setup_command.rb, line 263
263: def make_destination_dirs(install_destdir)
264: lib_dir = nil
265: bin_dir = nil
266:
267: prefix = options[:prefix]
268: site_or_vendor = options[:site_or_vendor]
269:
270: if prefix.empty? then
271: lib_dir = Gem::ConfigMap[site_or_vendor]
272: bin_dir = Gem::ConfigMap[:bindir]
273: else
274: # Apple installed RubyGems into libdir, and RubyGems <= 1.1.0 gets
275: # confused about installation location, so switch back to
276: # sitelibdir/vendorlibdir.
277: if defined?(APPLE_GEM_HOME) and
278: # just in case Apple and RubyGems don't get this patched up proper.
279: (prefix == Gem::ConfigMap[:libdir] or
280: # this one is important
281: prefix == File.join(Gem::ConfigMap[:libdir], 'ruby')) then
282: lib_dir = Gem::ConfigMap[site_or_vendor]
283: bin_dir = Gem::ConfigMap[:bindir]
284: else
285: lib_dir = File.join prefix, 'lib'
286: bin_dir = File.join prefix, 'bin'
287: end
288: end
289:
290: unless install_destdir.empty? then
291: lib_dir = File.join install_destdir, lib_dir.gsub(/^[a-zA-Z]:/, '')
292: bin_dir = File.join install_destdir, bin_dir.gsub(/^[a-zA-Z]:/, '')
293: end
294:
295: mkdir_p lib_dir
296: mkdir_p bin_dir
297:
298: return lib_dir, bin_dir
299: end
# File lib/rubygems/commands/setup_command.rb, line 301
301: def remove_old_bin_files(bin_dir)
302: old_bin_files = {
303: 'gem_mirror' => 'gem mirror',
304: 'gem_server' => 'gem server',
305: 'gemlock' => 'gem lock',
306: 'gemri' => 'ri',
307: 'gemwhich' => 'gem which',
308: 'index_gem_repository.rb' => 'gem generate_index',
309: }
310:
311: old_bin_files.each do |old_bin_file, new_name|
312: old_bin_path = File.join bin_dir, old_bin_file
313: next unless File.exist? old_bin_path
314:
315: deprecation_message = "`#{old_bin_file}` has been deprecated. Use `#{new_name}` instead."
316:
317: File.open old_bin_path, 'w' do |fp|
318: fp.write "#!\#{Gem.ruby}\n\nabort \"\#{deprecation_message}\"\n"
319: end
320:
321: next unless Gem.win_platform?
322:
323: File.open "#{old_bin_path}.bat", 'w' do |fp|
324: fp.puts %{@ECHO.#{deprecation_message}}
325: end
326: end
327: end
# File lib/rubygems/commands/setup_command.rb, line 334
334: def remove_source_caches(install_destdir)
335: if install_destdir.empty?
336: require 'rubygems/source_info_cache'
337:
338: user_cache_file = File.join(install_destdir,
339: Gem::SourceInfoCache.user_cache_file)
340: system_cache_file = File.join(install_destdir,
341: Gem::SourceInfoCache.system_cache_file)
342:
343: say "Removing old source_cache files" if Gem.configuration.really_verbose
344: rm_f user_cache_file if File.writable? File.dirname(user_cache_file)
345: rm_f system_cache_file if File.writable? File.dirname(system_cache_file)
346: end
347: end
# File lib/rubygems/commands/setup_command.rb, line 349
349: def run_rdoc(*args)
350: begin
351: gem 'rdoc'
352: rescue Gem::LoadError
353: end
354:
355: require 'rdoc/rdoc'
356:
357: args << '--quiet'
358: args << '--main' << 'README'
359: args << '.' << 'README' << 'LICENSE.txt' << 'GPL.txt'
360:
361: r = RDoc::RDoc.new
362: r.document args
363: end