#!/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 yapf. import urllib.request import json import tempfile import subprocess import fileinput import re from pathlib import Path 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") def main() -> None: url = "https://api.github.com/repos/radare/radare2/releases/latest" with urllib.request.urlopen(url) as response: release = json.load(response) # type: ignore version = release["tag_name"] with tempfile.TemporaryDirectory() as dirname: def git(*args: str) -> str: return sh("git", "-C", dirname, *args) git("clone", "--branch", version, "https://github.com/radare/radare2", ".") sha256 = prefetch_github("radare", "radare2", version) nix_file = str(Path(__file__).parent.joinpath("default.nix")) cs_tip = None with open(Path(dirname).joinpath("shlr", "Makefile")) as makefile: for l in makefile: match = re.match("CS_TIP=(\S+)", l) if match: cs_tip = match.group(1) assert cs_tip is not None cs_sha256 = prefetch_github("aquynh", "capstone", cs_tip) in_block = False with fileinput.FileInput(nix_file, inplace=True) as f: for l in f: if "#" in l: in_block = True print(f""" # # DO NOT EDIT! Automatically generated by ./update.py version_commit = "{git("rev-list", "--all", "--count")}"; gittap = "{git("describe", "--tags", "--match", "[0-9]*")}"; gittip = "{git("rev-parse", "HEAD")}"; version = "{version}"; sha256 = "{sha256}"; cs_tip = "{cs_tip}"; cs_sha256 = "{cs_sha256}"; #""") elif "#" in l: in_block = False elif not in_block: print(l, end="") if __name__ == "__main__": main()