123456789_123456789_123456789_123456789_123456789_

Class: Gem::Commands::PristineCommand

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
Instance Chain:
Inherits: Gem::Command
Defined in: lib/rubygems/commands/pristine_command.rb

Constant Summary

::Gem::Command - Inherited

HELP

Class Attribute Summary

::Gem::Command - Inherited

.build_args

Arguments used when building gems.

.build_args=, .extra_args, .extra_args=

Class Method Summary

::Gem::Command - Inherited

.add_common_option,
.add_specific_extra_args

Add a list of extra arguments for the given command.

.common_options,
.new

Initializes a generic gem command named command.

.specific_extra_args

Return an array of extra arguments for the command.

.specific_extra_args_hash

Accessor for the specific extra args hash (self initializing).

Instance Attribute Summary

::Gem::Command - Inherited

#command

The name of the command.

#defaults

The default options for the command.

#options

The options for the command.

#program_name

The name of the command for command-line invocation.

#summary

A short description of the command.

::Gem::DefaultUserInteraction - Included

Instance Method Summary

::Gem::VersionOption - Included

#add_platform_option

Add the –platform option to the option parser.

#add_prerelease_option

Add the –prerelease option to the option parser.

#add_version_option

Add the –version option to the option parser.

::Gem::Command - Inherited

#add_extra_args

Adds extra args from ~/.gemrc.

#add_option

Add a command-line option and handler to the command.

#arguments

Override to provide details of the arguments a command takes.

#begins?

True if long begins with the characters from short.

#defaults_str

Override to display the default values of the command options.

#description

Override to display a longer description of what this command does.

#execute

Override to provide command handling.

#get_all_gem_names

Get all gem names from the command line.

#get_all_gem_names_and_versions

Get all [gem, version] from the command line.

#get_one_gem_name

Get a single gem name from the command line.

#get_one_optional_argument

Get a single optional argument from the command line.

#handle_options

Handle the given list of arguments by parsing them and recording the results.

#handles?

True if the command handles the given argument list.

#invoke

Invoke the command with the given list of arguments.

#invoke_with_build_args

Invoke the command with the given list of normal arguments and additional build arguments.

#merge_options

Merge a set of command options with the set of default options (without modifying the default option hash).

#remove_option

Remove previously defined command-line argument name.

#show_help

Display the help message for the command.

#show_lookup_failure

Display to the user that a gem couldn’t be found and reasons why.

#usage

Override to display the usage for an individual gem command.

#when_invoked

Call the given block when invoked.

#add_parser_run_info

Adds a section with title and content to the parser help view.

#configure_options,
#create_option_parser

Creates an option parser and fills it in with the help info for the command.

#parser

Create on demand parser.

#wrap

Wraps text to width

#add_parser_description, #add_parser_options, #add_parser_summary

::Gem::UserInteraction - Included

#alert

Displays an alert statement.

#alert_error

Displays an error statement to the error output location.

#alert_warning

Displays a warning statement to the warning output location.

#ask

Asks a question and returns the answer.

#ask_for_password

Asks for a password with a prompt

#ask_yes_no

Asks a yes or no question.

#choose_from_list

Asks the user to answer question with an answer from the given list.

#say

Displays the given statement on the standard output (or equivalent).

#terminate_interaction

Terminates the RubyGems process with the given exit_code

#verbose

Calls say with msg or the results of the block if really_verbose is true.

::Gem::DefaultUserInteraction - Included

::Gem::Text - Included

#clean_text

Remove any non-printable characters and make the text suitable for printing.

#format_text

Wraps text to wrap characters and optionally indents by indent characters.

#levenshtein_distance

This code is based directly on the ::Gem::Text gem implementation Returns a value representing the “cost” of transforming str1 into str2.

#truncate_text, #min3

Constructor Details

.newPristineCommand

[ GitHub ]

  
# File 'lib/rubygems/commands/pristine_command.rb', line 11

def initialize
  super 'pristine',
        'Restores installed gems to pristine condition from files located in the gem cache',
        :version => Gem::Requirement.default,
        :extensions => true,
        :extensions_set => false,
        :all => false

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

  add_option('--skip=gem_name',
             'used on --all, skip if name == gem_name') do |value, options|
    options[:skip] ||= []
    options[:skip] << value
  end

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

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

  add_option('-E', '--[no-]env-shebang',
             'Rewrite executables with a shebang',
             'of /usr/bin/env') do |value, options|
    options[:env_shebang] = value
  end

  add_option('-n', '--bindir DIR',
             'Directory where executables are',
             'located') do |value, options|
    options[:bin_dir] = File.expand_path(value)
  end

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

Instance Method Details

#arguments

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rubygems/commands/pristine_command.rb', line 58

def arguments # :nodoc:
  "GEMNAME       gem to restore to pristine condition (unless --all)"
end

#defaults_str

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rubygems/commands/pristine_command.rb', line 62

def defaults_str # :nodoc:
  '--extensions'
end

#description

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rubygems/commands/pristine_command.rb', line 66

def description # :nodoc:
  <<-EOF
The pristine command compares an installed gem with the contents of its
cached .gem file and restores any files that don't match the cached .gem's
copy.

If you have made modifications to an installed gem, the pristine command
will revert them.  All extensions are rebuilt and all bin stubs for the gem
are regenerated after checking for modifications.

If the cached gem cannot be found it will be downloaded.

If --no-extensions is provided pristine will not attempt to restore a gem
with an extension.

If --extensions is given (but not --all or gem names) only gems with
extensions will be restored.
  EOF
end

#execute

[ GitHub ]

  
# File 'lib/rubygems/commands/pristine_command.rb', line 90

def execute
  specs = if options[:all]
            Gem::Specification.map

          # `--extensions` must be explicitly given to pristine only gems
          # with extensions.
          elsif options[:extensions_set] and
                options[:extensions] and options[:args].empty?
            Gem::Specification.select do |spec|
              spec.extensions and not spec.extensions.empty?
            end
          else
            get_all_gem_names.sort.map do |gem_name|
              Gem::Specification.find_all_by_name(gem_name, options[:version]).reverse
            end.flatten
          end

  if specs.to_a.empty?
    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

    if options.has_key? :skip
      if options[:skip].include? spec.name
        say "Skipped #{spec.full_name}, it was given through options"
        next
      end
    end

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

    gem = spec.cache_file

    unless File.exist? gem or options[:only_executables]
      require 'rubygems/remote_fetcher'

      say "Cached gem for #{spec.full_name} not found, attempting to fetch..."

      dep = Gem::Dependency.new spec.name, spec.version
      found, _ = Gem::SpecFetcher.fetcher.spec_for_dependency dep

      if found.empty?
        say "Skipped #{spec.full_name}, it was not found from cache and remote sources"
        next
      end

      spec_candidate, source = found.first
      Gem::RemoteFetcher.fetcher.download spec_candidate, source.uri.to_s, spec.base_dir
    end

    env_shebang =
      if options.include? :env_shebang
        options[:env_shebang]
      else
        install_defaults = Gem::ConfigFile::PLATFORM_DEFAULTS['install']
        install_defaults.to_s['--env-shebang']
      end

    bin_dir = options[:bin_dir] if options[:bin_dir]

    installer_options = {
      :wrappers => true,
      :force => true,
      :install_dir => spec.base_dir,
      :env_shebang => env_shebang,
      :build_args => spec.build_args,
      :bin_dir => bin_dir
    }

    if options[:only_executables]
      installer = Gem::Installer.for_spec(spec, installer_options)
      installer.generate_bin
    else
      installer = Gem::Installer.at(gem, installer_options)
      installer.install
    end

    say "Restored #{spec.full_name}"
  end
end

#usage

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rubygems/commands/pristine_command.rb', line 86

def usage # :nodoc:
  "#{program_name} [GEMNAME ...]"
end