lib/cfoundry/zip.rb
require "zip/zipfilesystem"
module CFoundry
# Generic Zpi API. Uses rubyzip underneath, but may be changed in the future
# to use system zip command if necessary.
module Zip
# Directory entries to exclude from packing.
PACK_EXCLUSION_GLOBS = %w(.. . *~ #*# *.log)
module_function
# Get the entries in the zip file. Returns an array of the entire
# contents, recursively (not just top-level).
def entry_lines(file)
entries = []
::Zip::ZipFile.foreach(file) do |zentry|
entries << zentry
end
entries
end
# Unpack a zip +file+ to directory +dest+.
def unpack(file, dest)
::Zip::ZipFile.foreach(file) do |zentry|
epath = "#{dest}/#{zentry}"
dirname = File.dirname(epath)
FileUtils.mkdir_p(dirname) unless File.exists?(dirname)
zentry.extract(epath) unless File.exists?(epath)
end
end
# Determine what files in +dir+ to pack.
def files_to_pack(dir)
Dir.glob("#{dir}/**/*", File::FNM_DOTMATCH).select do |f|
File.exists?(f) &&
PACK_EXCLUSION_GLOBS.none? do |e|
File.fnmatch(e, File.basename(f))
end
end
end
# Package directory +dir+ as file +zipfile+.
def pack(dir, zipfile)
files = files_to_pack(dir)
return false if files.empty?
::Zip::ZipFile.open(zipfile, true) do |zf|
files.each do |f|
zf.add(f.sub("#{dir}/",''), f)
end
end
true
end
end
end