Module: Nuri::Util::Tar

Defined in:
lib/nuri/targz.rb

Instance Method Summary collapse

Instance Method Details

#gzip(tarfile) ⇒ Object

gzips the underlying string in the given StringIO, returning a new StringIO representing the compressed file.



44
45
46
47
48
49
50
51
52
53
# File 'lib/nuri/targz.rb', line 44

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

#tar(path, prefix = "") ⇒ Object

Creates a tar file in memory recursively from the given path.

Returns a StringIO whose underlying String is the contents of the tar file.



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/nuri/targz.rb', line 18

def tar(path, prefix="")
	prefix += "/" unless prefix[-1] == '/' or prefix.length <= 0
	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}\/?/, ''
			relative_file = prefix + relative_file
	
			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

#targzip(path, prefix = "") ⇒ Object



9
10
11
# File 'lib/nuri/targz.rb', line 9

def targzip(path, prefix="")
	gzip(tar(path, prefix))
end

#ungzip(tarfile) ⇒ Object

un-gzips the given IO, returning the decompressed version as a StringIO



57
58
59
60
61
62
# File 'lib/nuri/targz.rb', line 57

def ungzip(tarfile)
	z = Zlib::GzipReader.new(tarfile)
	unzipped = StringIO.new(z.read)
	z.close
	unzipped
end

#untar(io, destination) ⇒ Object

untars the given IO into the specified directory



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/nuri/targz.rb', line 66

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
					f.write tarfile.read
				end
			end
		end
	end
end