Class: Gem::Package::Old
- Inherits:
- 
      Gem::Package
      
        - Object
- Gem::Package
- Gem::Package::Old
 
- Defined in:
- lib/rubygems/package/old.rb
Overview
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.
Instance Attribute Summary
Attributes inherited from Gem::Package
#build_time, #checksums, #data_mode, #dir_mode, #files, #gem, #prog_mode, #security_policy
Instance Method Summary collapse
- 
  
    
      #contents  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    A list of file names contained in this gem. 
- 
  
    
      #extract_files(destination_dir)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Extracts the files in this package into destination_dir.
- 
  
    
      #file_list(io)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Reads the file list section from the old-format gem io.
- 
  
    
      #initialize(gem, security_policy)  ⇒ Old 
    
    
  
  
  
    constructor
  
  
  
  
  
  
  
    Creates a new old-format package reader for gem.
- 
  
    
      #read_until_dashes(io)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Reads lines until a “—” separator is found. 
- 
  
    
      #skip_ruby(io)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Skips the Ruby self-install header in io.
- 
  
    
      #spec  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    The specification for this gem. 
- 
  
    
      #verify  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Raises an exception if a security policy that verifies data is active. 
Methods inherited from Gem::Package
#add_checksums, #add_contents, #add_files, #add_metadata, build, #build, #copy_stream, #copy_to, #digest, #extract_tar_gz, #file_mode, #gzip_to, #install_location, #limit_read, #load_spec, new, #normalize_path, #open_tar_gz, raw_spec, #read_checksums, #setup_signer, #verify_checksums, #verify_entry, #verify_files, #verify_gz
Methods included from UserInteraction
#alert, #alert_error, #alert_warning, #ask, #ask_for_password, #ask_yes_no, #choose_from_list, #say, #terminate_interaction, #verbose
Methods included from DefaultUserInteraction
ui, #ui, ui=, #ui=, use_ui, #use_ui
Methods included from Text
#clean_text, #format_text, #levenshtein_distance, #min3, #truncate_text
Constructor Details
#initialize(gem, security_policy) ⇒ Old
Creates a new old-format package reader for gem.  Old-format packages cannot be written.
| 22 23 24 25 26 27 28 29 30 31 | # 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 | 
Instance Method Details
#contents ⇒ Object
A list of file names contained in this gem
| 36 37 38 39 40 41 42 43 44 45 46 47 | # 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) ⇒ Object
Extracts the files in this package into destination_dir
| 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | # 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 | 
#file_list(io) ⇒ Object
Reads the file list section from the old-format gem io
| 97 98 99 100 101 102 103 104 105 | # File 'lib/rubygems/package/old.rb', line 97 def file_list(io) # :nodoc: header = String.new read_until_dashes io do |line| header << line end Gem::SafeYAML.safe_load header end | 
#read_until_dashes(io) ⇒ Object
Reads lines until a “—” separator is found
| 110 111 112 113 114 | # File 'lib/rubygems/package/old.rb', line 110 def read_until_dashes(io) # :nodoc: while (line = io.gets) && line.chomp.strip != "---" do yield line if block_given? end end | 
#skip_ruby(io) ⇒ Object
Skips the Ruby self-install header in io.
| 119 120 121 122 123 124 125 126 127 128 | # File 'lib/rubygems/package/old.rb', line 119 def skip_ruby(io) # :nodoc: loop do line = io.gets return if line.chomp == "__END__" break unless line end raise Gem::Exception, "Failed to find end of Ruby script while reading gem" end | 
#spec ⇒ Object
The specification for this gem
| 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 | # 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 ⇒ Object
Raises an exception if a security policy that verifies data is active. Old format gems cannot be verified as signed.
| 160 161 162 163 164 165 166 167 168 | # 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 |