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)

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

# 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

Public Instance Methods

contents ()

A list of file names contained in this gem

# 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

# 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.unpack1("m")
      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), mode: dir_mode && 0o755

      File.open destination, "wb", file_mode(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

# 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

  begin
    @spec = Gem::Specification.from_yaml yaml
  rescue Psych::SyntaxError
    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.

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