summarylogtreecommitdiffstats
path: root/render_pkgbuild.py
blob: cd10e8f3093b55b31f05cfb0880eaddb30dadf42 (plain)
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
#!/usr/bin/env python3
import hashlib
import json
import pathlib
import re
import sys
import typing

import jinja2
import requests
from github import Github


REPO_NAME = "fleetdm/fleet"
VERSION_PATTERN = re.compile(r"orbit-v([0-9]+\.[0-9]+\.[0-9]+)")

REPO = Github().get_repo(REPO_NAME)
METADATA_PATH = pathlib.Path("./metadata.json")


class TagInfo(typing.TypedDict):
    name: str
    pkgver: str
    commit_sha: str
    tarball_url: str


class Metadata(typing.TypedDict):
    tag_info: TagInfo
    release_sha512sum: str


def query_latest_tag_info() -> TagInfo:
    for tag in REPO.get_tags():
        match = VERSION_PATTERN.match(tag.name)
        if match is not None:
            return {
                "name": tag.name,
                "pkgver": match.group(1),
                "commit_sha": tag.commit.sha,
                "tarball_url": f"https://github.com/{REPO_NAME}/archive/refs/tags/{tag.name}.tar.gz",
            }

    raise RuntimeError("No tag matching pattern found.")


def refresh_metadata(tag_info: TagInfo) -> Metadata:
    release_sha512sum: typing.Optional[str] = None
    if METADATA_PATH.exists():
        old_metadata: Metadata = json.loads(METADATA_PATH.read_text())
        if tag_info == old_metadata["tag_info"]:
            release_sha512sum = old_metadata["release_sha512sum"]

    metadata: Metadata = {
        "tag_info": tag_info,
        "release_sha512sum": release_sha512sum
        or compute_remote_checksum(tag_info["tarball_url"]),
    }

    METADATA_PATH.write_text(json.dumps(metadata, sort_keys=True, indent=2))
    return metadata


def compute_remote_checksum(url: str, sumfunc=hashlib.sha512, chunk_size=1024) -> str:
    s = sumfunc()
    with requests.get(url, stream=True) as resp:
        for content in resp.iter_content(chunk_size=chunk_size):
            s.update(content)
    return s.hexdigest()


def render_pkgbuild(metadata: Metadata) -> None:
    env = jinja2.Environment(loader=jinja2.FileSystemLoader("."))
    env.globals["sha512sum"] = lambda path: hashlib.sha512(
        pathlib.Path(path).read_bytes()
    ).hexdigest()
    template = env.get_template("./PKGBUILD.jinja")
    result = template.render(metadata=metadata)
    pathlib.Path("./PKGBUILD").write_text(result)


def main() -> bool:
    tag_info = query_latest_tag_info()
    metadata = refresh_metadata(tag_info)
    render_pkgbuild(metadata)
    return True


if __name__ == "__main__":
    sys.exit(not bool(main()))