def self.archive(archive, paths, options = {})
if archive.kind_of?(String) && File.exist?(archive) then
tmp_archive_path = nil
File.open(archive) do |archive_in|
Tempfile.open(*File.split(archive_in.path).reverse) do |archive_out|
tmp_archive_path = archive_out.path
archive_out.binmode
open(archive_in, :r) do |z_in|
open(archive_out, :w) do |z_out|
z_in.each { |entry| z_out << entry }
z_out.archive(paths, options)
end
end
end
end
File.chmod(0666 & ~File.umask, tmp_archive_path)
File.rename(tmp_archive_path, archive)
else
open(archive, :w) { |z| z.archive(paths, options) }
end
end