108 lines
3.0 KiB
Python
Raw Normal View History

2018-05-23 10:31:44 +01:00
#!/usr/bin/env nix-shell
#!nix-shell -p nix -p python3 -p git -i python
# USAGE - just run the script: ./update.py
# When editing this file, make also sure it passes the mypy typecheck
# and is formatted with black.
2018-05-23 10:31:44 +01:00
import fileinput
import json
2020-09-04 10:13:12 +02:00
import xml.etree.ElementTree as ET
from urllib.parse import urlparse
2018-05-23 10:31:44 +01:00
import re
import subprocess
import tempfile
import urllib.request
from datetime import datetime
2018-05-23 10:31:44 +01:00
from pathlib import Path
from typing import Dict
2018-05-23 10:31:44 +01:00
2018-09-04 22:51:35 +01:00
SCRIPT_DIR = Path(__file__).parent.resolve()
2018-05-23 10:31:44 +01:00
def sh(*args: str) -> str:
out = subprocess.check_output(list(args))
return out.strip().decode("utf-8")
def prefetch_github(owner: str, repo: str, ref: str) -> str:
return sh(
"nix-prefetch-url",
"--unpack",
f"https://github.com/{owner}/{repo}/archive/{ref}.tar.gz",
)
2018-05-23 10:31:44 +01:00
def get_radare2_rev() -> str:
2021-04-17 17:59:08 +02:00
feed_url = "https://github.com/radareorg/radare2/releases.atom"
2020-09-04 10:13:12 +02:00
with urllib.request.urlopen(feed_url) as resp:
tree = ET.fromstring(resp.read())
releases = tree.findall(".//{http://www.w3.org/2005/Atom}entry")
for release in releases:
link = release.find("{http://www.w3.org/2005/Atom}link")
assert link is not None
url = urlparse(link.attrib["href"])
tag = url.path.split("/")[-1]
if re.match(r"[0-9.]+", tag):
return tag
else:
print(f"ignore {tag}")
raise RuntimeError(f"No release found at {feed_url}")
def git(dirname: str, *args: str) -> str:
return sh("git", "-C", dirname, *args)
2018-05-23 10:31:44 +01:00
def get_repo_info(dirname: str, rev: str) -> Dict[str, str]:
sha256 = prefetch_github("radare", "radare2", rev)
return dict(
rev=rev,
sha256=sha256,
version_commit=git(dirname, "rev-list", "--all", "--count"),
gittap=git(dirname, "describe", "--tags", "--match", "[0-9]*"),
gittip=git(dirname, "rev-parse", "HEAD"),
)
def main() -> None:
version = get_radare2_rev()
with tempfile.TemporaryDirectory() as dirname:
git(
dirname,
"clone",
"--branch",
version,
"https://github.com/radare/radare2",
".",
)
nix_file = str(SCRIPT_DIR.joinpath("default.nix"))
2018-05-23 10:31:44 +01:00
info = get_repo_info(dirname, version)
timestamp = git(dirname, "log", "-n1", "--format=%at")
2018-05-23 10:31:44 +01:00
in_block = False
with fileinput.FileInput(nix_file, inplace=True) as f:
for l in f:
if "#<generated>" in l:
in_block = True
print(
f""" #<generated>
2018-05-23 10:31:44 +01:00
# DO NOT EDIT! Automatically generated by ./update.py
gittap = "{info["gittap"]}";
gittip = "{info["gittip"]}";
rev = "{info["rev"]}";
version = "{version}";
sha256 = "{info["sha256"]}";
#</generated>"""
)
2018-05-23 10:31:44 +01:00
elif "#</generated>" in l:
in_block = False
elif not in_block:
print(l, end="")
if __name__ == "__main__":
main()