123456789_123456789_123456789_123456789_123456789_

Class: Gem::Package::Old

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
Instance Chain:
Inherits: Gem::Package
Defined in: lib/rubygems/package/old.rb

Overview

The format class knows the guts of the ancient .gem file format and provides the capability to read such ancient gems.

Please pretend this doesn't exist.

Class Method Summary

::Gem::Package - Inherited

.build,
.new

Creates a new ::Gem::Package for the file at gem.

Instance Attribute Summary

::Gem::Package - Inherited

#security_policy

The security policy used for verifying the contents of this package.

#spec

The spec for this gem.

#spec=

Sets the ::Gem::Specification to use to build this package.

#checksums

Checksums for the contents of the package.

#files

The files in this package.

::Gem::DefaultUserInteraction - Included

Instance Method Summary

::Gem::Package - Inherited

#add_checksums

Adds a checksum for each entry in the gem to checksums.yaml.gz.

#build

Builds this package based on the specification set by #spec=

#contents

A list of file names contained in this gem.

#copy_to

Copies this package to Gem.path (if possible).

#extract_files

Extracts the files in this package into destination_dir

#gzip_to

Gzips content written to gz_io to io.

#initialize

Creates a new package that will read or write to the file gem.

#mkdir_p_safe,
#read_checksums

Reads and loads checksums.yaml.gz from the tar file gem

#realpath

See additional method definition at line 637.

#setup_signer

Prepares the gem for signing and checksum generation.

#verify

Verifies that this gem:

#verify_entry

Verifies entry in a .gem file.

#verify_files

Verifies the files of the gem

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

Constructor Details

.new(gem, security_policy) ⇒ Old

Creates a new old-format package reader for gem. Old-format packages cannot be written.

[ GitHub ]

  
# File 'lib/rubygems/package/old.rb', line 22

def initialize gem, security_policy
  require 'fileutils'
  require 'zlib'
  Gem.load_yaml

  @contents        = nil
  @gem             = gem
  @security_policy = security_policy
  @spec            = nil
end

Instance Method Details

#contents

A list of file names contained in this gem

[ GitHub ]

  
# File 'lib/rubygems/package/old.rb', line 36

def contents
  verify

  return @contents if @contents

  @gem.with_read_io do |io|
    read_until_dashes io # spec
    header = file_list io

    @contents = header.map { |file| file['path'] }
  end
end

#extract_files(destination_dir)

Extracts the files in this package into destination_dir

[ GitHub ]

  
# File 'lib/rubygems/package/old.rb', line 52

def extract_files destination_dir
  verify

  errstr = "Error reading files from gem"

  @gem.with_read_io do |io|
    read_until_dashes io # spec
    header = file_list io
    raise Gem::Exception, errstr unless header

    header.each do |entry|
      full_name = entry['path']

      destination = install_location full_name, destination_dir

      file_data = String.new

      read_until_dashes io do |line|
        file_data << line
      end

      file_data = file_data.strip.unpack("m")[0]
      file_data = Zlib::Inflate.inflate file_data

      raise Gem::Package::FormatError, "#{full_name} in #{@gem} is corrupt" if
        file_data.length != entry['size'].to_i

      FileUtils.rm_rf destination

      FileUtils.mkdir_p File.dirname destination

      open destination, 'wb', entry['mode'] do |out|
        out.write file_data
      end

      verbose destination
    end
  end
rescue Zlib::DataError
  raise Gem::Exception, errstr
end

#spec

The specification for this gem

[ GitHub ]

  
# File 'lib/rubygems/package/old.rb', line 133

def spec
  verify

  return @spec if @spec

  yaml = String.new

  @gem.with_read_io do |io|
    skip_ruby io
    read_until_dashes io do |line|
      yaml << line
    end
  end

  yaml_error = if RUBY_VERSION < '1.9' then
                 YAML::ParseError
               elsif YAML.const_defined?(:ENGINE) && YAML::ENGINE.yamler == 'syck' then
                 YAML::ParseError
               else
                 YAML::SyntaxError
               end

  begin
    @spec = Gem::Specification.from_yaml yaml
  rescue yaml_error
    raise Gem::Exception, "Failed to parse gem specification out of gem file"
  end
rescue ArgumentError
  raise Gem::Exception, "Failed to parse gem specification out of gem file"
end

#verify

Raises an exception if a security policy that verifies data is active. Old format gems cannot be verified as signed.

[ GitHub ]

  
# File 'lib/rubygems/package/old.rb', line 168

def verify
  return true unless @security_policy

  raise Gem::Security::Exception,
        'old format gems do not contain signatures and cannot be verified' if
    @security_policy.verify_data

  true
end