summaryrefslogtreecommitdiffstats
path: root/contrib/libs/cctz/tzdata/update.py
blob: e0f5208a189a4af057352f7283c9952f8bfc99d8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#!/usr/bin/env python3

import glob
import hashlib
import io
import os
import pathlib
import re
import shutil
import string
import subprocess
import sys
import tarfile
import tempfile
import urllib.request


def create_cmakelists(zoneinfo_dir):
    zoneinfo_dir = pathlib.Path(zoneinfo_dir)
    with open("ya.make.resources", "wt") as f:
        all_files = []
        for dir, _, files in zoneinfo_dir.walk():
            all_files += [
                (dir / file).relative_to(".")
                for file in files 
            ]
        f.write("RESOURCE(\n")
        for file in sorted(all_files):
            rel_path = file.relative_to(zoneinfo_dir)
            f.write(f"    {str(file): <40} /cctz/tzdata/{rel_path}\n")
        f.write(")")


def get_latest_version():
    index_html = urllib.request.urlopen('http://www.iana.org/time-zones').read()
    version_match = re.search('<a href="[^"]*">tzdata(.*).tar.gz</a>', index_html.decode())
    if not version_match:
        raise Exception('Failed to determine the latest tzdata version')
    return version_match.group(1)


def prepare_tzdata(version):
    temp_dir = "tmp"
    shutil.rmtree(temp_dir, ignore_errors=True)

    EXCLUDE = [
        "iso3166.tab",
        "leapseconds",
        "tzdata.zi",
        "zone.tab",
        "zone1970.tab",
        "zonenow.tab",
    ]

    try:
        for type in ('data', 'code'):
            filename = f'tz{type}{version}.tar.gz'
            url = f'http://www.iana.org/time-zones/repository/releases/{filename}'
            print(f'Downloading {url}')

            bytestream = io.BytesIO(urllib.request.urlopen(url).read())
            print(f'Extracting {filename}')
            with tarfile.open(fileobj=bytestream, mode="r:gz") as f:
                f.extractall(path=temp_dir)
        
        print('Converting tzdata to binary format')
        subprocess.check_call(
            ['make', "--silent", "TOPDIR=.", 'install'],
            cwd=temp_dir,
        )
        
        shutil.rmtree(f"{temp_dir}/usr/share/zoneinfo/etc")
        for path in EXCLUDE:
            os.remove(f"{temp_dir}/usr/share/zoneinfo/{path}")

        # keep posixrules for now
        shutil.copyfile(
            "generated/posixrules",
            f"{temp_dir}/usr/share/zoneinfo/posixrules",
        )

        print('Preparing ya.make.resources')
        shutil.rmtree("generated", ignore_errors=True)
        os.rename(f"{temp_dir}/usr/share/zoneinfo", "generated")
        create_cmakelists("generated")
    finally:
        shutil.rmtree(temp_dir)


def main():
    version = get_latest_version()
    print(f'Importing tzdata {version}')
    prepare_tzdata(version)

if __name__ == '__main__':
    
    main()