class Gem::Package::Old

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.

Public Class Methods

new(gem) click to toggle source

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

# File lib/rubygems/package/old.rb, line 21
def initialize gem
  require 'fileutils'
  require 'zlib'
  Gem.load_yaml

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

Public Instance Methods

contents() click to toggle source

A list of file names contained in this gem

# File lib/rubygems/package/old.rb, line 35
def contents
  verify

  return @contents if @contents

  open @gem, 'rb' do |io|
    read_until_dashes io # spec
    header = file_list io

    @contents = header.map { |file| file['path'] }
  end
end
extract_files(destination_dir) click to toggle source

Extracts the files in this package into destination_dir

# File lib/rubygems/package/old.rb, line 51
def extract_files destination_dir
  verify

  errstr = "Error reading files from gem"

  open @gem, 'rb' 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 = ''

      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

      say destination if Gem.configuration.really_verbose
    end
  end
rescue Zlib::DataError
  raise Gem::Exception, errstr
end
spec() click to toggle source

The specification for this gem

# File lib/rubygems/package/old.rb, line 132
def spec
  verify

  return @spec if @spec

  yaml = ''

  open @gem, 'rb' 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::ENGINE.yamler == 'syck' then
                 YAML::ParseError
               else
                 YAML::SyntaxError
               end

  begin
    @spec = Gem::Specification.from_yaml yaml
  rescue yaml_error => e
    raise Gem::Exception, "Failed to parse gem specification out of gem file"
  end
rescue ArgumentError => e
  raise Gem::Exception, "Failed to parse gem specification out of gem file"
end
verify() click to toggle source

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

# File lib/rubygems/package/old.rb, line 167
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