##// END OF EJS Templates
timestamp of gzip archives taken from changeset context
csaba.henk@creo.hu -
r4652:06de6567 default
parent child Browse files
Show More
@@ -8,6 +8,7
8 8 from i18n import _
9 9 from node import *
10 10 import cStringIO, os, stat, tarfile, time, util, zipfile
11 import zlib, gzip
11 12
12 13 def tidyprefix(dest, prefix, suffixes):
13 14 '''choose prefix to use for names in archive. make sure prefix is
@@ -36,15 +37,54 class tarit:
36 37 '''write archive to tar file or stream. can write uncompressed,
37 38 or compress with gzip or bzip2.'''
38 39
40 class GzipFileWithTime(gzip.GzipFile):
41
42 def __init__(self, *args, **kw):
43 timestamp = None
44 if 'timestamp' in kw:
45 timestamp = kw.pop('timestamp')
46 if timestamp == None:
47 self.timestamp = time.time()
48 else:
49 self.timestamp = timestamp
50 gzip.GzipFile.__init__(self, *args, **kw)
51
52 def _write_gzip_header(self):
53 self.fileobj.write('\037\213') # magic header
54 self.fileobj.write('\010') # compression method
55 fname = self.filename[:-3]
56 flags = 0
57 if fname:
58 flags = gzip.FNAME
59 self.fileobj.write(chr(flags))
60 gzip.write32u(self.fileobj, long(self.timestamp))
61 self.fileobj.write('\002')
62 self.fileobj.write('\377')
63 if fname:
64 self.fileobj.write(fname + '\000')
65
39 66 def __init__(self, dest, prefix, mtime, kind=''):
40 67 self.prefix = tidyprefix(dest, prefix, ['.tar', '.tar.bz2', '.tar.gz',
41 68 '.tgz', '.tbz2'])
42 69 self.mtime = mtime
70
71 def taropen(name, mode, fileobj=None):
72 if kind == 'gz':
73 mode = mode[0]
74 if not fileobj:
75 fileobj = open(name, mode)
76 gzfileobj = self.GzipFileWithTime(name, mode + 'b',
77 zlib.Z_BEST_COMPRESSION,
78 fileobj, timestamp=mtime)
79 return tarfile.TarFile.taropen(name, mode, gzfileobj)
80 else:
81 return tarfile.open(name, mode + kind, fileobj)
82
43 83 if isinstance(dest, str):
44 self.z = tarfile.open(dest, mode='w:'+kind)
84 self.z = taropen(dest, mode='w:')
45 85 else:
46 86 # Python 2.5-2.5.1 have a regression that requires a name arg
47 self.z = tarfile.open(name='', mode='w|'+kind, fileobj=dest)
87 self.z = taropen(name='', mode='w|', fileobj=dest)
48 88
49 89 def addfile(self, name, mode, data):
50 90 i = tarfile.TarInfo(self.prefix + name)
General Comments 0
You need to be logged in to leave comments. Login now