In Files

  • rubygems/commands/pristine_command.rb

Parent

Methods

Included Modules

Class/Module Index [+]

Quicksearch

Gem::Commands::PristineCommand

Public Class Methods

new() click to toggle source
 
               # File rubygems/commands/pristine_command.rb, line 10
def initialize
  super 'pristine',
        'Restores installed gems to pristine condition from files located in the gem cache',
        :version => Gem::Requirement.default,
        :extensions => true,
        :all => false

  add_option('--all',
             'Restore all installed gems to pristine',
             'condition') do |value, options|
    options[:all] = value
  end

  add_option('--[no-]extensions',
             'Restore gems with extensions',
             'in addition to regular gems') do |value, options|
    options[:extensions] = value
  end

  add_option('--only-executables',
             'Only restore executables') do |value, options|
    options[:only_executables] = value
  end

  add_version_option('restore to', 'pristine condition')
end
            

Public Instance Methods

execute() click to toggle source
 
               # File rubygems/commands/pristine_command.rb, line 66
def execute
  specs = if options[:all] then
            Gem::Specification.map
          else
            get_all_gem_names.map do |gem_name|
              Gem::Specification.find_all_by_name gem_name, options[:version]
            end.flatten
          end

  if specs.to_a.empty? then
    raise Gem::Exception,
          "Failed to find gems #{options[:args]} #{options[:version]}"
  end

  install_dir = Gem.dir # TODO use installer option

  raise Gem::FilePermissionError.new(install_dir) unless
    File.writable?(install_dir)

  say "Restoring gems to pristine condition..."

  specs.each do |spec|
    if spec.default_gem?
      say "Skipped #{spec.full_name}, it is a default gem"
      next
    end

    unless spec.extensions.empty? or options[:extensions] then
      say "Skipped #{spec.full_name}, it needs to compile an extension"
      next
    end

    gem = spec.cache_file

    unless File.exist? gem then
      require 'rubygems/remote_fetcher'

      say "Cached gem for #{spec.full_name} not found, attempting to fetch..."
      dep = Gem::Dependency.new spec.name, spec.version
      Gem::RemoteFetcher.fetcher.download_to_cache dep
    end

    # TODO use installer options
    install_defaults = Gem::ConfigFile::PLATFORM_DEFAULTS['install']
    installer_env_shebang = install_defaults.to_s['--env-shebang']

    installer = Gem::Installer.new(gem,
                                   :wrappers => true,
                                   :force => true,
                                   :install_dir => spec.base_dir,
                                   :env_shebang => installer_env_shebang,
                                   :build_args => spec.build_args)
    if options[:only_executables] then
      installer.generate_bin
    else
      installer.install
    end

    say "Restored #{spec.full_name}"
  end
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