mirror of
https://github.com/zeux/pugixml.git
synced 2024-12-28 06:10:55 +08:00
e3524c90de
We used to use the current timestamp when building the archive; switch to using the timestamp of the tag with the version we're packaging. This requires some monkey patching since tarfile module is always using current timestamp when writing gzip header... Also exclude archive.py from archive and simplify release file list in Makefile.
54 lines
1.6 KiB
Python
54 lines
1.6 KiB
Python
import os.path
|
|
import sys
|
|
import tarfile
|
|
import time
|
|
import zipfile
|
|
import StringIO
|
|
|
|
def read_file(path, use_crlf):
|
|
with open(path, 'rb') as file:
|
|
data = file.read()
|
|
|
|
if '\0' not in data:
|
|
data = data.replace('\r', '')
|
|
if use_crlf:
|
|
data = data.replace('\n', '\r\n')
|
|
|
|
return data
|
|
|
|
def write_zip(target, arcprefix, timestamp, sources):
|
|
with zipfile.ZipFile(target, 'w') as archive:
|
|
for source in sorted(sources):
|
|
data = read_file(source, use_crlf = True)
|
|
path = os.path.join(arcprefix, source)
|
|
info = zipfile.ZipInfo(path)
|
|
info.date_time = time.localtime(timestamp)
|
|
info.compress_type = zipfile.ZIP_DEFLATED
|
|
archive.writestr(info, data)
|
|
|
|
def write_tar(target, arcprefix, timestamp, sources, compression):
|
|
with tarfile.open(target, 'w:' + compression) as archive:
|
|
for source in sorted(sources):
|
|
data = read_file(source, use_crlf = False)
|
|
path = os.path.join(arcprefix, source)
|
|
info = tarfile.TarInfo(path)
|
|
info.size = len(data)
|
|
info.mtime = timestamp
|
|
archive.addfile(info, StringIO.StringIO(data))
|
|
|
|
if len(sys.argv) < 5:
|
|
raise RuntimeError('Usage: python archive.py <target> <archive prefix> <timestamp> <source files>')
|
|
|
|
target, arcprefix, timestamp = sys.argv[1:4]
|
|
sources = sys.argv[4:]
|
|
|
|
# tarfile._Stream._init_write_gz always writes current time to gzip header
|
|
time.time = lambda: timestamp
|
|
|
|
if target.endswith('.zip'):
|
|
write_zip(target, arcprefix, int(timestamp), sources)
|
|
elif target.endswith('.tar.gz') or target.endswith('.tar.bz2'):
|
|
write_tar(target, arcprefix, int(timestamp), sources, compression = os.path.splitext(target)[1][1:])
|
|
else:
|
|
raise NotImplementedError('File type not supported: ' + target)
|