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 Methods
3.4
View on GitHub
# File tmp/rubies/ruby-3.4.1/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
Creates a new old-format package reader for gem. Old-format packages cannot be written.
Instance Methods
#
3.4
View on GitHub
# File tmp/rubies/ruby-3.4.1/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
A list of file names contained in this gem
3.4
View on GitHub
# File tmp/rubies/ruby-3.4.1/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
Extracts the files in this package into destination_dir
#
3.4
View on GitHub
# File tmp/rubies/ruby-3.4.1/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
The specification for this gem
#
3.4
View on GitHub
# File tmp/rubies/ruby-3.4.1/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
Raises an exception if a security policy that verifies data is active. Old format gems cannot be verified as signed.