summarylogtreecommitdiffstats
path: root/render_pkgbuild.py
diff options
context:
space:
mode:
Diffstat (limited to 'render_pkgbuild.py')
-rwxr-xr-xrender_pkgbuild.py90
1 files changed, 90 insertions, 0 deletions
diff --git a/render_pkgbuild.py b/render_pkgbuild.py
new file mode 100755
index 000000000000..cd10e8f3093b
--- /dev/null
+++ b/render_pkgbuild.py
@@ -0,0 +1,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()))