73 lines
2.3 KiB
Python
Executable File
73 lines
2.3 KiB
Python
Executable File
#!/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()
|