|
|
@ -3,7 +3,7 @@ import os |
|
|
|
import tempfile |
|
|
|
import shutil |
|
|
|
import json |
|
|
|
from subprocess import check_call |
|
|
|
from subprocess import check_call, check_output |
|
|
|
from tarfile import TarFile |
|
|
|
|
|
|
|
from dateutil.zoneinfo import METADATA_FN, ZONEFILENAME |
|
|
@ -23,11 +23,9 @@ def rebuild(filename, tag=None, format="gz", zonegroups=[], metadata=None): |
|
|
|
for name in zonegroups: |
|
|
|
tf.extract(name, tmpdir) |
|
|
|
filepaths = [os.path.join(tmpdir, n) for n in zonegroups] |
|
|
|
try: |
|
|
|
check_call(["zic", "-d", zonedir] + filepaths) |
|
|
|
except OSError as e: |
|
|
|
_print_on_nosuchfile(e) |
|
|
|
raise |
|
|
|
|
|
|
|
_run_zic(zonedir, filepaths) |
|
|
|
|
|
|
|
# write metadata file |
|
|
|
with open(os.path.join(zonedir, METADATA_FN), 'w') as f: |
|
|
|
json.dump(metadata, f, indent=4, sort_keys=True) |
|
|
@ -40,6 +38,30 @@ def rebuild(filename, tag=None, format="gz", zonegroups=[], metadata=None): |
|
|
|
shutil.rmtree(tmpdir) |
|
|
|
|
|
|
|
|
|
|
|
def _run_zic(zonedir, filepaths): |
|
|
|
"""Calls the ``zic`` compiler in a compatible way to get a "fat" binary. |
|
|
|
|
|
|
|
Recent versions of ``zic`` default to ``-b slim``, while older versions |
|
|
|
don't even have the ``-b`` option (but default to "fat" binaries). The |
|
|
|
current version of dateutil does not support Version 2+ TZif files, which |
|
|
|
causes problems when used in conjunction with "slim" binaries, so this |
|
|
|
function is used to ensure that we always get a "fat" binary. |
|
|
|
""" |
|
|
|
|
|
|
|
try: |
|
|
|
help_text = check_output(["zic", "--help"]) |
|
|
|
except OSError as e: |
|
|
|
_print_on_nosuchfile(e) |
|
|
|
raise |
|
|
|
|
|
|
|
if b"-b " in help_text: |
|
|
|
bloat_args = ["-b", "fat"] |
|
|
|
else: |
|
|
|
bloat_args = [] |
|
|
|
|
|
|
|
check_call(["zic"] + bloat_args + ["-d", zonedir] + filepaths) |
|
|
|
|
|
|
|
|
|
|
|
def _print_on_nosuchfile(e): |
|
|
|
"""Print helpful troubleshooting message |
|
|
|
|
|
|
|