Merge with crew-stable
authorBryan O'Sullivan <bryano@fb.com>
Wed, 19 Sep 2012 09:38:51 -0700
changeset 17629 331d611813ec
parent 17627 84f12b832ee8 (current diff)
parent 17628 133d13e44544 (diff)
child 17630 ff5ed1ecd43a
Merge with crew-stable
mercurial/archival.py
tests/test-archive.t
--- a/mercurial/archival.py	Tue Sep 18 21:39:12 2012 +0900
+++ b/mercurial/archival.py	Wed Sep 19 09:38:51 2012 -0700
@@ -12,6 +12,7 @@
 import scmutil, util, encoding
 import cStringIO, os, tarfile, time, zipfile
 import zlib, gzip
+import struct
 
 # from unzip source code:
 _UNX_IFREG = 0x8000
@@ -169,6 +170,7 @@
         if mtime < epoch:
             mtime = epoch
 
+        self.mtime = mtime
         self.date_time = time.gmtime(mtime)[:6]
 
     def addfile(self, name, mode, islink, data):
@@ -182,6 +184,14 @@
             mode = 0777
             ftype = _UNX_IFLNK
         i.external_attr = (mode | ftype) << 16L
+        # add "extended-timestamp" extra block, because zip archives
+        # without this will be extracted with unexpected timestamp,
+        # if TZ is not configured as GMT
+        i.extra += struct.pack('<hhBl',
+                               0x5455,     # block type: "extended-timestamp"
+                               1 + 4,      # size of this block
+                               1,          # "modification time is present"
+                               self.mtime) # time of last modification (UTC)
         self.z.writestr(i, data)
 
     def done(self):
--- a/tests/test-archive.t	Tue Sep 18 21:39:12 2012 +0900
+++ b/tests/test-archive.t	Wed Sep 19 09:38:51 2012 -0700
@@ -270,3 +270,31 @@
   \s*147\s+2 files (re)
 
   $ cd ..
+
+issue3600: check whether "hg archive" can create archive files which
+are extracted with expected timestamp, even though TZ is not
+configured as GMT.
+
+  $ mkdir issue3600
+  $ cd issue3600
+
+  $ hg init repo
+  $ echo a > repo/a
+  $ hg -R repo add repo/a
+  $ hg -R repo commit -m '#0' -d '456789012 21600'
+  $ cat > show_mtime.py <<EOF
+  > import sys, os
+  > print int(os.stat(sys.argv[1]).st_mtime)
+  > EOF
+
+  $ hg -R repo archive --prefix tar-extracted archive.tar
+  $ (TZ=UTC-3; export TZ; tar xf archive.tar)
+  $ python show_mtime.py tar-extracted/a
+  456789012
+
+  $ hg -R repo archive --prefix zip-extracted archive.zip
+  $ (TZ=UTC-3; export TZ; unzip -q archive.zip)
+  $ python show_mtime.py zip-extracted/a
+  456789012
+
+  $ cd ..