about summary refs log tree commit diff
path: root/pkgs/development/tools/analysis/radare2/update.py
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/development/tools/analysis/radare2/update.py')
-rwxr-xr-xpkgs/development/tools/analysis/radare2/update.py72
1 files changed, 72 insertions, 0 deletions
diff --git a/pkgs/development/tools/analysis/radare2/update.py b/pkgs/development/tools/analysis/radare2/update.py
new file mode 100755
index 000000000000..1f16a00905c1
--- /dev/null
+++ b/pkgs/development/tools/analysis/radare2/update.py
@@ -0,0 +1,72 @@
+#!/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 "#<generated>" in l:
+                    in_block = True
+                    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>""")
+                elif "#</generated>" in l:
+                    in_block = False
+                elif not in_block:
+                    print(l, end="")
+
+
+if __name__ == "__main__":
+    main()