diff options
author | shadchin <shadchin@yandex-team.com> | 2023-10-10 11:35:31 +0300 |
---|---|---|
committer | shadchin <shadchin@yandex-team.com> | 2023-10-10 11:54:48 +0300 |
commit | 656bb1fb2814e586db5de6166ebbb17363d5325b (patch) | |
tree | 31b755ba74120fea597c6d00ce9ff1d0ca7b728a /contrib/python/python-dateutil/py2/dateutil/zoneinfo/rebuild.py | |
parent | 3896b7591b5f3231ceb4bfe69cf9863b237d8b78 (diff) | |
download | ydb-656bb1fb2814e586db5de6166ebbb17363d5325b.tar.gz |
Split python-dateutil on py2/py3
Diffstat (limited to 'contrib/python/python-dateutil/py2/dateutil/zoneinfo/rebuild.py')
-rw-r--r-- | contrib/python/python-dateutil/py2/dateutil/zoneinfo/rebuild.py | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/contrib/python/python-dateutil/py2/dateutil/zoneinfo/rebuild.py b/contrib/python/python-dateutil/py2/dateutil/zoneinfo/rebuild.py new file mode 100644 index 0000000000..684c6586f0 --- /dev/null +++ b/contrib/python/python-dateutil/py2/dateutil/zoneinfo/rebuild.py @@ -0,0 +1,75 @@ +import logging +import os +import tempfile +import shutil +import json +from subprocess import check_call, check_output +from tarfile import TarFile + +from dateutil.zoneinfo import METADATA_FN, ZONEFILENAME + + +def rebuild(filename, tag=None, format="gz", zonegroups=[], metadata=None): + """Rebuild the internal timezone info in dateutil/zoneinfo/zoneinfo*tar* + + filename is the timezone tarball from ``ftp.iana.org/tz``. + + """ + tmpdir = tempfile.mkdtemp() + zonedir = os.path.join(tmpdir, "zoneinfo") + moduledir = os.path.dirname(__file__) + try: + with TarFile.open(filename) as tf: + for name in zonegroups: + tf.extract(name, tmpdir) + filepaths = [os.path.join(tmpdir, n) for n in zonegroups] + + _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) + target = os.path.join(moduledir, ZONEFILENAME) + with TarFile.open(target, "w:%s" % format) as tf: + for entry in os.listdir(zonedir): + entrypath = os.path.join(zonedir, entry) + tf.add(entrypath, entry) + finally: + 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 + + e is an exception raised by subprocess.check_call() + + """ + if e.errno == 2: + logging.error( + "Could not find zic. Perhaps you need to install " + "libc-bin or some other package that provides it, " + "or it's not in your PATH?") |