Class: Gel::Package

Inherits:
Object
  • Object
show all
Defined in:
lib/gel/package.rb,
lib/gel/package/inspector.rb

Defined Under Namespace

Classes: Inspector, Installer, Specification, YAMLLoader

Class Method Summary collapse

Class Method Details

.extract(filename, receiver) ⇒ Object



123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# File 'lib/gel/package.rb', line 123

def self.extract(filename, receiver)
  File.open(filename) do |io|
    Gel::Support::Tar::TarReader.new(io) do |package_reader|
      sums = with_file(package_reader, "checksums.yaml.gz", nil) do |sum_stream|
        yaml = Zlib::GzipReader.new(sum_stream).read

        if Psych::VERSION < "3.1" # Ruby 2.5 & below
          ::YAML.safe_load(yaml, [], [], false, "#{filename}:checksums.yaml.gz")
        else
          ::YAML.safe_load(yaml, filename: "#{filename}:checksums.yaml.gz")
        end
      end

      spec = with_file(package_reader, "metadata.gz", sums) do |meta_stream|
        yaml = Zlib::GzipReader.new(meta_stream).read
        loaded = YAMLLoader.load(yaml, "#{filename}:metadata.gz")
        Specification.new(loaded)
      end or raise "no metadata.gz"

      return receiver.gem(spec) do |target|
        with_file(package_reader, "data.tar.gz", sums) do |data_stream|
          Gel::Support::Tar::TarReader.new(Zlib::GzipReader.new(data_stream)) do |data_reader|
            data_reader.each do |entry|
              target.file(entry.full_name, entry, entry.header.mode)
            end
          end
          true
        end or raise "no data.tar.gz"
      end
    end
  end
end

.with_file(reader, filename, checksums) ⇒ Object



106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'lib/gel/package.rb', line 106

def self.with_file(reader, filename, checksums)
  reader.seek(filename) do |stream|
    if checksums
      data = stream.read
      stream.rewind

      checksums.each do |type, map|
        next unless %w(SHA1 SHA512).include?(type)
        calculated = Digest(type).hexdigest(data)
        raise "#{type} checksum mismatch on #{filename}" unless calculated == map[filename]
      end
    end

    yield stream
  end
end