0
0
mirror of https://github.com/zeux/pugixml.git synced 2024-12-28 06:10:55 +08:00
pugixml/scripts/archive.py
Arseny Kapoulkine e3524c90de scripts: Make archive build reproducible
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.
2016-11-28 23:24:27 -08:00

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)