class Rake::Funnel::Support::Zipper

Public Class Methods

zip(files, target, zip_root = nil) click to toggle source
# File lib/rake/funnel/support/zipper.rb, line 11
def zip(files, target, zip_root = nil)
  raise 'Target not defined' unless target

  target_dir = File.dirname(target)
  RakeFileUtils.mkdir_p(target_dir) unless File.directory?(target_dir)

  configure_zip
  create_zip(files || [], target, zip_root)
end

Private Class Methods

configure_zip() click to toggle source
# File lib/rake/funnel/support/zipper.rb, line 23
def configure_zip
  ::Zip.unicode_names = true
  ::Zip.default_compression = Zlib::BEST_COMPRESSION
end
create_zip(files, target, zip_root) click to toggle source
# File lib/rake/funnel/support/zipper.rb, line 28
def create_zip(files, target, zip_root)
  ::Zip::File.open(target, ::Zip::File::CREATE) do |zip|
    common_path = files.common_path

    files.each do |file|
      zipped_file = get_zipped_path(common_path, file, zip_root)

      entry = zip.add(zipped_file, file)
      set_mtime(entry, file)
    end
  end
end
get_zipped_path(common_path, file, zip_root) click to toggle source
# File lib/rake/funnel/support/zipper.rb, line 41
def get_zipped_path(common_path, file, zip_root)
  file = Pathname.new(file).relative_path_from(Pathname.new(common_path)).to_s unless common_path.nil?
  file = File.join(zip_root, file) unless zip_root.nil? || zip_root.empty?
  file
end
set_mtime(entry, file) click to toggle source

To work around this bug: github.com/rubyzip/rubyzip/issues/176

# File lib/rake/funnel/support/zipper.rb, line 48
def set_mtime(entry, file)
  entry.time = ::Zip::DOSTime.at(File.mtime(file))
  entry.extra.delete('UniversalTime')
end