Merged revisions 68319 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r68319 | antoine.pitrou | 2009-01-04 22:29:23 +0100 (dim., 04 janv. 2009) | 3 lines

  Issue #4272: Add an optional argument to the GzipFile constructor to override the timestamp in the gzip stream.
........
diff --git a/Lib/gzip.py b/Lib/gzip.py
index 11d5571..560a722 100644
--- a/Lib/gzip.py
+++ b/Lib/gzip.py
@@ -54,7 +54,7 @@
     max_read_chunk = 10 * 1024 * 1024   # 10Mb
 
     def __init__(self, filename=None, mode=None,
-                 compresslevel=9, fileobj=None):
+                 compresslevel=9, fileobj=None, mtime=None):
         """Constructor for the GzipFile class.
 
         At least one of fileobj and filename must be given a
@@ -81,6 +81,15 @@
         level of compression; 1 is fastest and produces the least compression,
         and 9 is slowest and produces the most compression.  The default is 9.
 
+        The mtime argument is an optional numeric timestamp to be written
+        to the stream when compressing.  All gzip compressed streams
+        are required to contain a timestamp.  If omitted or None, the
+        current time is used.  This module ignores the timestamp when
+        decompressing; however, some programs, such as gunzip, make use
+        of it.  The format of the timestamp is the same as that of the
+        return value of time.time() and of the st_mtime member of the
+        object returned by os.stat().
+
         """
 
         # guarantee the file is opened in binary mode on platforms
@@ -119,6 +128,7 @@
 
         self.fileobj = fileobj
         self.offset = 0
+        self.mtime = mtime
 
         if self.mode == WRITE:
             self._write_gzip_header()
@@ -157,7 +167,10 @@
         if fname:
             flags = FNAME
         self.fileobj.write(chr(flags).encode('latin-1'))
-        write32u(self.fileobj, int(time.time()))
+        mtime = self.mtime
+        if mtime is None:
+            mtime = time.time()
+        write32u(self.fileobj, int(mtime))
         self.fileobj.write(b'\002')
         self.fileobj.write(b'\377')
         if fname:
@@ -175,10 +188,10 @@
         if method != 8:
             raise IOError('Unknown compression method')
         flag = ord( self.fileobj.read(1) )
-        # modtime = self.fileobj.read(4)
+        self.mtime = read32(self.fileobj)
         # extraflag = self.fileobj.read(1)
         # os = self.fileobj.read(1)
-        self.fileobj.read(6)
+        self.fileobj.read(2)
 
         if flag & FEXTRA:
             # Read & discard the extra field, if present