Sha256: 98abfdfd3b5b42a763cd1dab4ac29f65e1654da0c69fb1aa855d75e50a09abc7

Contents?: true

Size: 1.28 KB

Versions: 7

Compression:

Stored size: 1.28 KB

Contents

require_relative "cpio/cpio"
require_relative "cpio/cpio_old_format"

module Excavate
  module Extractors
    class CpioExtractor < Extractor
      def extract(target)
        extract_cpio_new_format(target)
      rescue RuntimeError => e
        raise unless e.message.start_with?("Invalid magic")

        extract_cpio_old_format(target)
      end

      private

      def extract_cpio_new_format(target)
        File.open(@archive, "rb") do |archive_file|
          CPIO::ASCIIReader.new(archive_file).each do |entry, file|
            path = File.join(target, entry.name)
            if entry.directory?
              FileUtils.mkdir_p(path)
            else
              FileUtils.mkdir_p(File.dirname(path))
              File.write(path, file.read, mode: "wb")
            end
          end
        end
      end

      def extract_cpio_old_format(target)
        File.open(@archive, "rb") do |archive_file|
          CPIO::ArchiveReader.new(archive_file).each_entry do |entry|
            path = File.expand_path(entry.filename, target)
            if entry.directory?
              FileUtils.mkdir_p(path)
            else
              FileUtils.mkdir_p(File.dirname(path))
              File.write(path, entry.data, mode: "wb")
            end
          end
        end
      end
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
excavate-0.3.1 lib/excavate/extractors/cpio_extractor.rb
excavate-0.3.0 lib/excavate/extractors/cpio_extractor.rb
excavate-0.2.5 lib/excavate/extractors/cpio_extractor.rb
excavate-0.2.4 lib/excavate/extractors/cpio_extractor.rb
excavate-0.2.3 lib/excavate/extractors/cpio_extractor.rb
excavate-0.2.2 lib/excavate/extractors/cpio_extractor.rb
excavate-0.2.1 lib/excavate/extractors/cpio_extractor.rb