Extended maintenance of Ruby versions 1.8.7 and 1.9.2 ended on July 31, 2014. Read more

In Files

  • rubygems/commands/setup_command.rb

Class/Module Index [+]

Quicksearch

Gem::Commands::SetupCommand

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

Public Class Methods

new() click to toggle source
 
               # File rubygems/commands/setup_command.rb, line 12
def initialize
  super 'setup', 'Install RubyGems',
        :format_executable => true, :rdoc => true, :ri => true,
        :site_or_vendor => :sitelibdir,
        :destdir => '', :prefix => ''

  add_option '--prefix=PREFIX',
             'Prefix path for installing RubyGems',
             'Will not affect gem repository location' do |prefix, options|
    options[:prefix] = File.expand_path prefix
  end

  add_option '--destdir=DESTDIR',
             'Root directory to install RubyGems into',
             'Mainly used for packaging RubyGems' do |destdir, options|
    options[:destdir] = File.expand_path destdir
  end

  add_option '--[no-]vendor',
             'Install into vendorlibdir not sitelibdir',
             '(Requires Ruby 1.8.7)' do |vendor, options|
    if vendor and Gem.ruby_version < Gem::Version.new('1.8.7') then
      raise OptionParser::InvalidOption,
            "requires ruby 1.8.7+ (you have #{Gem.ruby_version})"
    end

    options[:site_or_vendor] = vendor ? :vendorlibdir : :sitelibdir
  end

  add_option '--[no-]format-executable',
             'Makes `gem` match ruby',
             'If ruby is ruby18, gem will be gem18' do |value, options|
    options[:format_executable] = value
  end

  add_option '--[no-]rdoc',
             'Generate RDoc documentation for RubyGems' do |value, options|
    options[:rdoc] = value
  end

  add_option '--[no-]ri',
             'Generate RI documentation for RubyGems' do |value, options|
    options[:ri] = value
  end
end
            

Public Instance Methods

check_ruby_version() click to toggle source
 
               # File rubygems/commands/setup_command.rb, line 58
def check_ruby_version
  required_version = Gem::Requirement.new '>= 1.8.6'

  unless required_version.satisfied_by? Gem.ruby_version then
    alert_error "Expected Ruby version #{required_version}, is #{Gem.ruby_version}"
    terminate_interaction 1
  end
end
            
execute() click to toggle source
 
               # File rubygems/commands/setup_command.rb, line 89
def execute
  @verbose = Gem.configuration.really_verbose

  install_destdir = options[:destdir]

  unless install_destdir.empty? then
    ENV['GEM_HOME'] ||= File.join(install_destdir,
                                  Gem.default_dir.gsub(/^[a-zA-Z]:/, ''))
  end

  check_ruby_version

  if Gem.configuration.really_verbose then
    extend FileUtils::Verbose
  else
    extend FileUtils
  end

  lib_dir, bin_dir = make_destination_dirs install_destdir

  install_lib lib_dir

  install_executables bin_dir

  remove_old_bin_files bin_dir

  remove_source_caches install_destdir

  say "RubyGems #{Gem::VERSION} installed"

  uninstall_old_gemcutter

  install_rdoc

  say
  if @verbose then
    say "-" * 78
    say
  end

  release_notes = File.join Dir.pwd, 'History.txt'

  release_notes = if File.exist? release_notes then
                    open release_notes do |io|
                      text = io.gets '==='
                      text << io.gets('===')
                      text[0...-3]
                    end
                  else
                    "Oh-no! Unable to find release notes!"
                  end

  say release_notes

  say
  say "-" * 78
  say

  say "RubyGems installed the following executables:"
  say @bin_file_names.map { |name| "\t#{name}\n" }
  say

  unless @bin_file_names.grep(/#{File::SEPARATOR}gem$/) then
    say "If `gem` was installed by a previous RubyGems installation, you may need"
    say "to remove it by hand."
    say
  end
end
            
install_executables(bin_dir) click to toggle source
 
               # File rubygems/commands/setup_command.rb, line 158
  def install_executables(bin_dir)
    say "Installing gem executable" if @verbose

    @bin_file_names = []

    Dir.chdir 'bin' do
      bin_files = Dir['*']

      bin_files.delete 'update_rubygems'

      bin_files.each do |bin_file|
        bin_file_formatted = if options[:format_executable] then
                               Gem.default_exec_format % bin_file
                             else
                               bin_file
                             end

        dest_file = File.join bin_dir, bin_file_formatted
        bin_tmp_file = File.join Dir.tmpdir, bin_file

        begin
          bin = File.readlines bin_file
          bin[0] = "#!#{Gem.ruby}\n"

          File.open bin_tmp_file, 'w' do |fp|
            fp.puts bin.join
          end

          install bin_tmp_file, dest_file, :mode => 0755
          @bin_file_names << dest_file
        ensure
          rm bin_tmp_file
        end

        next unless Gem.win_platform?

        begin
          bin_cmd_file = File.join Dir.tmpdir, "#{bin_file}.bat"

          File.open bin_cmd_file, 'w' do |file|
            file.puts <<-TEXT
@ECHO OFF
IF NOT "%~f0" == "~f0" GOTO :WinNT
@"#{File.basename(Gem.ruby).chomp('"')}" "#{dest_file}" %1 %2 %3 %4 %5 %6 %7 %8 %9
GOTO :EOF
:WinNT
@"#{File.basename(Gem.ruby).chomp('"')}" "%~dpn0" %*
TEXT
          end

          install bin_cmd_file, "#{dest_file}.bat", :mode => 0755
        ensure
          rm bin_cmd_file
        end
      end
    end
  end
            
install_lib(lib_dir) click to toggle source
 
               # File rubygems/commands/setup_command.rb, line 216
def install_lib(lib_dir)
  say "Installing RubyGems" if @verbose

  Dir.chdir 'lib' do
    lib_files = Dir[File.join('**', '*rb')]

    lib_files.each do |lib_file|
      dest_file = File.join lib_dir, lib_file
      dest_dir = File.dirname dest_file
      mkdir_p dest_dir unless File.directory? dest_dir

      install lib_file, dest_file, :mode => 0644
    end
  end
end
            
install_rdoc() click to toggle source
 
               # File rubygems/commands/setup_command.rb, line 232
def install_rdoc
  gem_doc_dir = File.join Gem.dir, 'doc'
  rubygems_name = "rubygems-#{Gem::VERSION}"
  rubygems_doc_dir = File.join gem_doc_dir, rubygems_name

  if File.writable? gem_doc_dir and
     (not File.exist? rubygems_doc_dir or
      File.writable? rubygems_doc_dir) then
    say "Removing old RubyGems RDoc and ri" if @verbose
    Dir[File.join(Gem.dir, 'doc', 'rubygems-[0-9]*')].each do |dir|
      rm_rf dir
    end

    if options[:ri] then
      ri_dir = File.join rubygems_doc_dir, 'ri'
      say "Installing #{rubygems_name} ri into #{ri_dir}" if @verbose
      run_rdoc '--ri', '--op', ri_dir
    end

    if options[:rdoc] then
      rdoc_dir = File.join rubygems_doc_dir, 'rdoc'
      say "Installing #{rubygems_name} rdoc into #{rdoc_dir}" if @verbose
      run_rdoc '--op', rdoc_dir
    end
  elsif @verbose then
    say "Skipping RDoc generation, #{gem_doc_dir} not writable"
    say "Set the GEM_HOME environment variable if you want RDoc generated"
  end
end
            
make_destination_dirs(install_destdir) click to toggle source
 
               # File rubygems/commands/setup_command.rb, line 262
def make_destination_dirs(install_destdir)
  lib_dir = nil
  bin_dir = nil

  prefix = options[:prefix]
  site_or_vendor = options[:site_or_vendor]

  if prefix.empty? then
    lib_dir = Gem::ConfigMap[site_or_vendor]
    bin_dir = Gem::ConfigMap[:bindir]
  else
    # Apple installed RubyGems into libdir, and RubyGems <= 1.1.0 gets
    # confused about installation location, so switch back to
    # sitelibdir/vendorlibdir.
    if defined?(APPLE_GEM_HOME) and
      # just in case Apple and RubyGems don't get this patched up proper.
      (prefix == Gem::ConfigMap[:libdir] or
       # this one is important
       prefix == File.join(Gem::ConfigMap[:libdir], 'ruby')) then
       lib_dir = Gem::ConfigMap[site_or_vendor]
       bin_dir = Gem::ConfigMap[:bindir]
    else
      lib_dir = File.join prefix, 'lib'
      bin_dir = File.join prefix, 'bin'
    end
  end

  unless install_destdir.empty? then
    lib_dir = File.join install_destdir, lib_dir.gsub(/^[a-zA-Z]:/, '')
    bin_dir = File.join install_destdir, bin_dir.gsub(/^[a-zA-Z]:/, '')
  end

  mkdir_p lib_dir
  mkdir_p bin_dir

  return lib_dir, bin_dir
end
            
remove_old_bin_files(bin_dir) click to toggle source
 
               # File rubygems/commands/setup_command.rb, line 300
  def remove_old_bin_files(bin_dir)
    old_bin_files = {
      'gem_mirror' => 'gem mirror',
      'gem_server' => 'gem server',
      'gemlock' => 'gem lock',
      'gemri' => 'ri',
      'gemwhich' => 'gem which',
      'index_gem_repository.rb' => 'gem generate_index',
    }

    old_bin_files.each do |old_bin_file, new_name|
      old_bin_path = File.join bin_dir, old_bin_file
      next unless File.exist? old_bin_path

      deprecation_message = "`#{old_bin_file}` has been deprecated.  Use `#{new_name}` instead."

      File.open old_bin_path, 'w' do |fp|
        fp.write <<-EOF
#!#{Gem.ruby}

abort "#{deprecation_message}"
    EOF
      end

      next unless Gem.win_platform?

      File.open "#{old_bin_path}.bat", 'w' do |fp|
        fp.puts %Q{@ECHO.#{deprecation_message}}
      end
    end
  end
            
remove_source_caches(install_destdir) click to toggle source
 
               # File rubygems/commands/setup_command.rb, line 332
def remove_source_caches(install_destdir)
  if install_destdir.empty?
    require 'rubygems/source_info_cache'

    user_cache_file = File.join(install_destdir,
                                Gem::SourceInfoCache.user_cache_file)
    system_cache_file = File.join(install_destdir,
                                  Gem::SourceInfoCache.system_cache_file)

    say "Removing old source_cache files" if Gem.configuration.really_verbose
    rm_f user_cache_file if File.writable? File.dirname(user_cache_file)
    rm_f system_cache_file if File.writable? File.dirname(system_cache_file)
  end
end
            
run_rdoc(*args) click to toggle source
 
               # File rubygems/commands/setup_command.rb, line 347
def run_rdoc(*args)
  begin
    gem 'rdoc'
  rescue Gem::LoadError
  end

  require 'rdoc/rdoc'

  args << '--quiet'
  args << '--main' << 'README'
  args << '.' << 'README' << 'LICENSE.txt' << 'GPL.txt'

  r = RDoc::RDoc.new
  r.document args
end
            
uninstall_old_gemcutter() click to toggle source
 
               # File rubygems/commands/setup_command.rb, line 363
def uninstall_old_gemcutter
  require 'rubygems/uninstaller'

  ui = Gem::Uninstaller.new('gemcutter', :all => true, :ignore => true,
                            :version => '< 0.4')
  ui.uninstall
rescue Gem::InstallError
end
            

Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.

If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.

If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.

If you want to help improve the Ruby documentation, please visit Documenting-ruby.org.

blog comments powered by Disqus