Sha256: fbc82a2b8531c36df904e6f0d2f56248eb7c57771776933e47a86c369dae9830

Contents?: true

Size: 1.97 KB

Versions: 15

Compression:

Stored size: 1.97 KB

Contents

require 'rubygems'
require 'rubygems/package'
require 'zlib'
require 'fileutils'

module Jax::Util::Tar
  # Creates a tar file in memory recursively
  # from the given path.
  #
  # Returns a StringIO whose underlying String
  # is the contents of the tar file.
  def tar(path)
    tarfile = StringIO.new("")
    Gem::Package::TarWriter.new(tarfile) do |tar|
      Dir[File.join(path, "**/*")].each do |file|
        mode = File.stat(file).mode
        relative_file = file.sub /^#{Regexp::escape path}\/?/, ''
        
        if File.directory?(file)
          tar.mkdir relative_file, mode
        else
          tar.add_file relative_file, mode do |tf|
            File.open(file, "rb") { |f| tf.write f.read }
          end
        end
      end
    end
    
    tarfile.rewind
    tarfile
  end
  
  # gzips the underlying string in the given StringIO,
  # returning a new StringIO representing the 
  # compressed file.
  def gzip(tarfile)
    gz = StringIO.new("")
    z = Zlib::GzipWriter.new(gz)
    z.write tarfile.string
    z.close # this is necessary!
    
    # z was closed to write the gzip footer, so
    # now we need a new StringIO
    StringIO.new gz.string
  end
  
  # un-gzips the given IO, returning the
  # decompressed version as a StringIO
  def ungzip(tarfile)
    z = Zlib::GzipReader.new(tarfile)
    unzipped = StringIO.new(z.read)
    z.close
    unzipped
  end
  
  # untars the given IO into the specified
  # directory
  def untar(io, destination)
    Gem::Package::TarReader.new io do |tar|
      tar.each do |tarfile|
        destination_file = File.join destination, tarfile.full_name
        
        if tarfile.directory?
          FileUtils.mkdir_p destination_file
        else
          destination_directory = File.dirname(destination_file)
          FileUtils.mkdir_p destination_directory unless File.directory?(destination_directory)
          File.open destination_file, "wb" do |f|
            f.print tarfile.read
          end
        end
      end
    end
  end
end

Version data entries

15 entries across 15 versions & 1 rubygems

Version Path
jax-3.0.0.rc2 lib/jax/util/tar.rb
jax-2.0.12 lib/jax/util/tar.rb
jax-3.0.0.rc1 lib/jax/util/tar.rb
jax-2.0.11 lib/jax/util/tar.rb
jax-2.0.10 lib/jax/util/tar.rb
jax-2.0.9 lib/jax/util/tar.rb
jax-2.0.8 lib/jax/util/tar.rb
jax-2.0.7 lib/jax/util/tar.rb
jax-2.0.6 lib/jax/util/tar.rb
jax-2.0.5 lib/jax/util/tar.rb
jax-2.0.4 lib/jax/util/tar.rb
jax-2.0.3 lib/jax/util/tar.rb
jax-2.0.2 lib/jax/util/tar.rb
jax-2.0.1 lib/jax/util/tar.rb
jax-2.0.0 lib/jax/util/tar.rb