# 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, security_policy) 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, security_policy
      require 'fileutils'
      require 'zlib'
      Gem.load_yaml

      @contents        = nil
      @gem             = gem
      @security_policy = security_policy
      @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

      @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) 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"

      @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

          File.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() 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 = 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() 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