Method: Gem::Package::Old#extract_files

Defined in:
lib/rubygems/package/old.rb

#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