diff options
Diffstat (limited to 'pkgs/development/tools/analysis/radare2/update.py')
-rwxr-xr-x | pkgs/development/tools/analysis/radare2/update.py | 123 |
1 files changed, 91 insertions, 32 deletions
diff --git a/pkgs/development/tools/analysis/radare2/update.py b/pkgs/development/tools/analysis/radare2/update.py index 1f16a00905c1..fae6a52a3920 100755 --- a/pkgs/development/tools/analysis/radare2/update.py +++ b/pkgs/development/tools/analysis/radare2/update.py @@ -2,14 +2,16 @@ #!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 +# and is formatted with black. import fileinput +import json import re +import subprocess +import tempfile +import urllib.request +from datetime import datetime from pathlib import Path +from typing import Dict def sh(*args: str) -> str: @@ -18,50 +20,107 @@ def sh(*args: str) -> str: 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") + return sh( + "nix-prefetch-url", + "--unpack", + f"https://github.com/{owner}/{repo}/archive/{ref}.tar.gz", + ) -def main() -> None: +def get_radare2_rev() -> str: 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: + return release["tag_name"] + + +def get_r2_cutter_rev() -> str: + url = "https://api.github.com/repos/radareorg/cutter/contents/" + with urllib.request.urlopen(url) as response: + data = json.load(response) # type: ignore + for entry in data: + if entry["name"] == "radare2": + return entry["sha"] + raise Exception("no radare2 submodule found in github.com/radareorg/cutter") + - def git(*args: str) -> str: - return sh("git", "-C", dirname, *args) +def git(dirname: str, *args: str) -> str: + return sh("git", "-C", dirname, *args) - git("clone", "--branch", version, "https://github.com/radare/radare2", - ".") - sha256 = prefetch_github("radare", "radare2", version) + +def get_repo_info(dirname: str, rev: str) -> Dict[str, str]: + sha256 = prefetch_github("radare", "radare2", rev) + + 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) + + 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"), + cs_tip=cs_tip, + cs_sha256=cs_sha256, + ) + + +def write_package_expr(version: str, info: Dict[str, str]) -> str: + return f"""generic {{ + version_commit = "{info["version_commit"]}"; + gittap = "{info["gittap"]}"; + gittip = "{info["gittip"]}"; + rev = "{info["rev"]}"; + version = "{version}"; + sha256 = "{info["sha256"]}"; + cs_tip = "{info["cs_tip"]}"; + cs_sha256 = "{info["cs_sha256"]}"; + }}""" + + +def main() -> None: + radare2_rev = get_radare2_rev() + r2_cutter_rev = get_r2_cutter_rev() + + with tempfile.TemporaryDirectory() as dirname: + git( + dirname, + "clone", + "--branch", + radare2_rev, + "https://github.com/radare/radare2", + ".", + ) 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 + radare2_info = get_repo_info(dirname, radare2_rev) + + git(dirname, "checkout", r2_cutter_rev) + + timestamp = git(dirname, "log", "-n1", "--format=%at") + r2_cutter_version = datetime.fromtimestamp(int(timestamp)).strftime("%Y-%m-%d") - cs_sha256 = prefetch_github("aquynh", "capstone", cs_tip) + r2_cutter_info = get_repo_info(dirname, r2_cutter_rev) 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> + print( + f""" #<generated> # 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}"; - #</generated>""") + radare2 = {write_package_expr(radare2_rev, radare2_info)}; + r2-for-cutter = {write_package_expr(r2_cutter_version, r2_cutter_info)}; + #</generated>""" + ) elif "#</generated>" in l: in_block = False elif not in_block: |