comparison mercurial/archival.py @ 2477:857591c586e0

use commit time as mtime for file archives. now output from two run of "hg archive -t zip" is same.
author Vadim Gelfer <vadim.gelfer@gmail.com>
date Wed, 21 Jun 2006 15:31:23 -0700
parents 0c0bfea3f72a
children e196aa1df169
comparison
equal deleted inserted replaced
2476:0f7e4a39d9af 2477:857591c586e0
35 35
36 class tarit: 36 class tarit:
37 '''write archive to tar file or stream. can write uncompressed, 37 '''write archive to tar file or stream. can write uncompressed,
38 or compress with gzip or bzip2.''' 38 or compress with gzip or bzip2.'''
39 39
40 def __init__(self, dest, prefix, kind=''): 40 def __init__(self, dest, prefix, mtime, kind=''):
41 self.prefix = tidyprefix(dest, prefix, ['.tar', '.tar.bz2', '.tar.gz', 41 self.prefix = tidyprefix(dest, prefix, ['.tar', '.tar.bz2', '.tar.gz',
42 '.tgz', 'tbz2']) 42 '.tgz', 'tbz2'])
43 self.mtime = int(time.time()) 43 self.mtime = mtime
44 if isinstance(dest, str): 44 if isinstance(dest, str):
45 self.z = tarfile.open(dest, mode='w:'+kind) 45 self.z = tarfile.open(dest, mode='w:'+kind)
46 else: 46 else:
47 self.z = tarfile.open(mode='w|'+kind, fileobj=dest) 47 self.z = tarfile.open(mode='w|'+kind, fileobj=dest)
48 48
76 76
77 class zipit: 77 class zipit:
78 '''write archive to zip file or stream. can write uncompressed, 78 '''write archive to zip file or stream. can write uncompressed,
79 or compressed with deflate.''' 79 or compressed with deflate.'''
80 80
81 def __init__(self, dest, prefix, compress=True): 81 def __init__(self, dest, prefix, mtime, compress=True):
82 self.prefix = tidyprefix(dest, prefix, ('.zip',)) 82 self.prefix = tidyprefix(dest, prefix, ('.zip',))
83 if not isinstance(dest, str): 83 if not isinstance(dest, str):
84 try: 84 try:
85 dest.tell() 85 dest.tell()
86 except (AttributeError, IOError): 86 except (AttributeError, IOError):
87 dest = tellable(dest) 87 dest = tellable(dest)
88 self.z = zipfile.ZipFile(dest, 'w', 88 self.z = zipfile.ZipFile(dest, 'w',
89 compress and zipfile.ZIP_DEFLATED or 89 compress and zipfile.ZIP_DEFLATED or
90 zipfile.ZIP_STORED) 90 zipfile.ZIP_STORED)
91 self.date_time = time.gmtime(time.time())[:6] 91 self.date_time = time.gmtime(mtime)[:6]
92 92
93 def addfile(self, name, mode, data): 93 def addfile(self, name, mode, data):
94 i = zipfile.ZipInfo(self.prefix + name, self.date_time) 94 i = zipfile.ZipInfo(self.prefix + name, self.date_time)
95 i.compress_type = self.z.compression 95 i.compress_type = self.z.compression
96 i.flag_bits = 0x08 96 i.flag_bits = 0x08
104 self.z.close() 104 self.z.close()
105 105
106 class fileit: 106 class fileit:
107 '''write archive as files in directory.''' 107 '''write archive as files in directory.'''
108 108
109 def __init__(self, name, prefix): 109 def __init__(self, name, prefix, mtime):
110 if prefix: 110 if prefix:
111 raise util.Abort(_('cannot give prefix when archiving to files')) 111 raise util.Abort(_('cannot give prefix when archiving to files'))
112 self.basedir = name 112 self.basedir = name
113 self.dirs = {} 113 self.dirs = {}
114 self.oflags = (os.O_CREAT | os.O_EXCL | os.O_WRONLY | 114 self.oflags = (os.O_CREAT | os.O_EXCL | os.O_WRONLY |
128 pass 128 pass
129 129
130 archivers = { 130 archivers = {
131 'files': fileit, 131 'files': fileit,
132 'tar': tarit, 132 'tar': tarit,
133 'tbz2': lambda name, prefix: tarit(name, prefix, 'bz2'), 133 'tbz2': lambda name, prefix, mtime: tarit(name, prefix, mtime, 'bz2'),
134 'tgz': lambda name, prefix: tarit(name, prefix, 'gz'), 134 'tgz': lambda name, prefix, mtime: tarit(name, prefix, mtime, 'gz'),
135 'uzip': lambda name, prefix: zipit(name, prefix, False), 135 'uzip': lambda name, prefix, mtime: zipit(name, prefix, mtime, False),
136 'zip': zipit, 136 'zip': zipit,
137 } 137 }
138 138
139 def archive(repo, dest, node, kind, decode=True, matchfn=None, 139 def archive(repo, dest, node, kind, decode=True, matchfn=None,
140 prefix=None): 140 prefix=None, mtime=None):
141 '''create archive of repo as it was at node. 141 '''create archive of repo as it was at node.
142 142
143 dest can be name of directory, name of archive file, or file 143 dest can be name of directory, name of archive file, or file
144 object to write archive to. 144 object to write archive to.
145 145
158 fp = cStringIO.StringIO() 158 fp = cStringIO.StringIO()
159 repo.wwrite(name, data, fp) 159 repo.wwrite(name, data, fp)
160 data = fp.getvalue() 160 data = fp.getvalue()
161 archiver.addfile(name, mode, data) 161 archiver.addfile(name, mode, data)
162 162
163 archiver = archivers[kind](dest, prefix) 163 change = repo.changelog.read(node)
164 mn = repo.changelog.read(node)[0] 164 mn = change[0]
165 archiver = archivers[kind](dest, prefix, mtime or change[2][0])
165 mf = repo.manifest.read(mn).items() 166 mf = repo.manifest.read(mn).items()
166 mff = repo.manifest.readflags(mn) 167 mff = repo.manifest.readflags(mn)
167 mf.sort() 168 mf.sort()
168 write('.hg_archival.txt', 0644, 169 write('.hg_archival.txt', 0644,
169 'repo: %s\nnode: %s\n' % (hex(repo.changelog.node(0)), hex(node))) 170 'repo: %s\nnode: %s\n' % (hex(repo.changelog.node(0)), hex(node)))