time attribute bug
Brought to you by:
thomas
The following bug was submitted to me by email:
Hi!
I'm investigating what seems to be a bug in RubyZip.
I'm trying to
create a zip file and maintain the timestamp of the
file. Here's what
I do:
Zip::ZipFile::open(filename) { |zipfile|
entry = zipfile.find_entry(entry_name)
if entry
entry.time = mtime
puts entry.time
end
zipfile.commit()
}
The time printed out by the "puts" statement does not
match the
timestamp in the generated zip-file.
Am I doing something wrong, or is the "time=" method
not implemented correctly?
--
/Jesper
Anonymous
Logged In: YES
user_id=1591032
Hi.
I found that the timestamp does not used in
ZipOutputStream.put_next_entry()
I made a patch.
--- zip.rb.orig Tue Sep 5 15:49:45 2006
+++ zip.rb Tue Sep 5 19:53:59 2006
@@ -953,7 +953,8 @@
# +entry+ can be a ZipEntry object or a string.
def put_next_entry(entry, level =
Zlib::DEFAULT_COMPRESSION)
raise ZipError, "zip stream is closed" if @closed
- newEntry = entry.kind_of?(ZipEntry) ? entry :
ZipEntry.new(@fileName, entry.to_s)
+ newEntry = entry.kind_of?(ZipEntry) ? entry :
ZipEntry.new(@fileName, entry.to_s,
+ "", "", 0, 0, ZipEntry::DEFLATED, 0, entry.time )
init_next_entry(newEntry, level)
@currentEntry=newEntry
end
Logged In: YES
user_id=1742486
Originator: NO
Hi. last patch works not well, so I wrote new patch.
rake test passed and files' mtime valid in local test code.
please test and import asap.
--- lib/zip/zip.rb.org 2007-03-12 22:29:16.000000000 +0900
+++ lib/zip/zip.rb 2007-03-13 16:31:30.000000000 +0900
@@ -954,6 +954,11 @@
def put_next_entry(entry, level = Zlib::DEFAULT_COMPRESSION)
raise ZipError, "zip stream is closed" if @closed
newEntry = entry.kind_of?(ZipEntry) ? entry : ZipEntry.new(@fileName, entry.to_s)
+ begin
+ newEntry.time= File.mtime( entry.to_s )
+ rescue
+ newEntry.time = Time.now()
+ end
init_next_entry(newEntry, level)
@currentEntry=newEntry
end
@@ -1667,11 +1672,13 @@
return '' unless s
self.class.const_get(:HEADER_ID) + [s.length].pack("v") + s
end
def to_c_dir_bin
s = pack_for_c_dir
+ return '' unless s
self.class.const_get(:HEADER_ID) + [s.length].pack("v") + s
end
end
@@ -1707,6 +1714,7 @@
end
def pack_for_local
+ return nil unless @flag
s = [@flag].pack("C")
@flag & 1 != 0 and s << [@mtime.to_i].pack("V")
@flag & 2 != 0 and s << [@atime.to_i].pack("V")
@@ -1715,6 +1723,7 @@
end
def pack_for_c_dir
+ return nil unless @flag
s = [@flag].pack("C")
@flag & 1 == 1 and s << [@mtime.to_i].pack("V")
s
Logged In: YES
user_id=1742486
Originator: NO
sorry, that patch has 2 silly miss(tab 2 space convert miss)
please replase 2 line
+ return nil unless @flag
to
+ return nil unless @flag
(1 space character lacks)