From 2697c7ea4fba6dca66acd4793965501b06ea8df6 Mon Sep 17 00:00:00 2001 From: Alexander Simonov Date: Sun, 9 Mar 2014 20:38:14 +0200 Subject: [PATCH] Fix #138 --- lib/zip/entry.rb | 4 +-- lib/zip/extra_field.rb | 1 + lib/zip/extra_field/old_unix.rb | 45 +++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 lib/zip/extra_field/old_unix.rb diff --git a/lib/zip/entry.rb b/lib/zip/entry.rb index 1fd3fa2..5b6c1e7 100755 --- a/lib/zip/entry.rb +++ b/lib/zip/entry.rb @@ -538,9 +538,9 @@ module Zip def write_to_zip_output_stream(zip_output_stream) #:nodoc:all if @ftype == :directory - zip_output_stream.put_next_entry(self) + zip_output_stream.put_next_entry(self, nil, nil, ::Zip::Entry::STORED) elsif @filepath - zip_output_stream.put_next_entry(self, nil, nil, nil) + zip_output_stream.put_next_entry(self, nil, nil, ::Zip::Entry::DEFLATED) get_input_stream { |is| ::Zip::IOExtras.copy_stream(zip_output_stream, is) } else zip_output_stream.copy_raw_entry(self) diff --git a/lib/zip/extra_field.rb b/lib/zip/extra_field.rb index 86f24ac..f7a7172 100755 --- a/lib/zip/extra_field.rb +++ b/lib/zip/extra_field.rb @@ -90,6 +90,7 @@ end require 'zip/extra_field/generic' require 'zip/extra_field/universal_time' +require 'zip/extra_field/old_unix' require 'zip/extra_field/unix' require 'zip/extra_field/zip64' require 'zip/extra_field/zip64_placeholder' diff --git a/lib/zip/extra_field/old_unix.rb b/lib/zip/extra_field/old_unix.rb new file mode 100644 index 0000000..3c6a440 --- /dev/null +++ b/lib/zip/extra_field/old_unix.rb @@ -0,0 +1,45 @@ +module Zip + # Olf Info-ZIP Extra for UNIX uid/gid and file timestampes + class ExtraField::OldUnix < ExtraField::Generic + HEADER_ID = "UX" + register_map + + def initialize(binstr = nil) + @uid = 0 + @gid = 0 + @atime = nil + @mtime = nil + binstr and merge(binstr) + end + + attr_accessor :uid, :gid, :atime, :mtime + + def merge(binstr) + return if binstr.empty? + size, content = initial_parse(binstr) + # size: 0 for central directory. 4 for local header + return if (!size || size == 0) + atime, mtime, uid, gid = content.unpack("VVvv") + @uid ||= uid + @gid ||= gid + @atime ||= atime + @mtime ||= mtime + end + + def ==(other) + @uid == other.uid && + @gid == other.gid && + @atime == other.atime && + @mtime == other.mtime + end + + def pack_for_local + [@atime, @mtime, @uid, @gid].pack("VVvv") + end + + def pack_for_c_dir + [@atime, @mtime].pack("VV") + end + end + +end \ No newline at end of file