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 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()
click to toggle source
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)
click to toggle source
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.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()
click to toggle source
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 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 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