Mercurial > hg
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))) |