summary refs log tree commit diff
path: root/pkgs/applications/emulators/retroarch/update.py
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/applications/emulators/retroarch/update.py')
-rwxr-xr-xpkgs/applications/emulators/retroarch/update.py179
1 files changed, 179 insertions, 0 deletions
diff --git a/pkgs/applications/emulators/retroarch/update.py b/pkgs/applications/emulators/retroarch/update.py
new file mode 100755
index 00000000000..68f72103168
--- /dev/null
+++ b/pkgs/applications/emulators/retroarch/update.py
@@ -0,0 +1,179 @@
+#!/usr/bin/env nix-shell
+#!nix-shell -I nixpkgs=../../../../ -i python3 -p "python3.withPackages (ps: with ps; [ requests nix-prefetch-github ])" -p "git"
+
+import json
+import sys
+import subprocess
+from pathlib import Path
+
+SCRIPT_PATH = Path(__file__).absolute().parent
+HASHES_PATH = SCRIPT_PATH / "hashes.json"
+CORES = {
+    "atari800": {"repo": "libretro-atari800"},
+    "beetle-gba": {"repo": "beetle-gba-libretro"},
+    "beetle-lynx": {"repo": "beetle-lynx-libretro"},
+    "beetle-ngp": {"repo": "beetle-ngp-libretro"},
+    "beetle-pce-fast": {"repo": "beetle-pce-fast-libretro"},
+    "beetle-pcfx": {"repo": "beetle-pcfx-libretro"},
+    "beetle-psx": {"repo": "beetle-psx-libretro"},
+    "beetle-saturn": {"repo": "beetle-saturn-libretro"},
+    "beetle-snes": {"repo": "beetle-bsnes-libretro"},
+    "beetle-supergrafx": {"repo": "beetle-supergrafx-libretro"},
+    "beetle-vb": {"repo": "beetle-vb-libretro"},
+    "beetle-wswan": {"repo": "beetle-wswan-libretro"},
+    "blastem": {"repo": "blastem"},
+    "bluemsx": {"repo": "bluemsx-libretro"},
+    "bsnes": {"repo": "bsnes-libretro"},
+    "bsnes-hd": {"repo": "bsnes-hd", "owner": "DerKoun"},
+    "bsnes-mercury": {"repo": "bsnes-mercury"},
+    "citra": {
+        "repo": "citra",
+        "fetch_submodules": True,
+        "deep_clone": True,
+        "leave_dot_git": True,
+    },
+    "citra-canary": {
+        "repo": "citra",
+        "fetch_submodules": True,
+        "deep_clone": True,
+        "leave_dot_git": True,
+        "rev": "canary",
+    },
+    "desmume": {"repo": "desmume"},
+    "desmume2015": {"repo": "desmume2015"},
+    "dolphin": {"repo": "dolphin"},
+    "dosbox": {"repo": "dosbox-libretro"},
+    "eightyone": {"repo": "81-libretro"},
+    "fbalpha2012": {"repo": "fbalpha2012"},
+    "fbneo": {"repo": "fbneo"},
+    "fceumm": {"repo": "libretro-fceumm"},
+    "flycast": {"repo": "flycast"},
+    "fmsx": {"repo": "fmsx-libretro"},
+    "freeintv": {"repo": "freeintv"},
+    "gambatte": {"repo": "gambatte-libretro"},
+    "genesis-plus-gx": {"repo": "Genesis-Plus-GX"},
+    "gpsp": {"repo": "gpsp"},
+    "gw": {"repo": "gw-libretro"},
+    "handy": {"repo": "libretro-handy"},
+    "hatari": {"repo": "hatari"},
+    "mame": {"repo": "mame"},
+    "mame2000": {"repo": "mame2000-libretro"},
+    "mame2003": {"repo": "mame2003-libretro"},
+    "mame2003-plus": {"repo": "mame2003-plus-libretro"},
+    "mame2010": {"repo": "mame2010-libretro"},
+    "mame2015": {"repo": "mame2015-libretro"},
+    "mame2016": {"repo": "mame2016-libretro"},
+    "melonds": {"repo": "melonds"},
+    "mesen": {"repo": "mesen"},
+    "mesen-s": {"repo": "mesen-s"},
+    "meteor": {"repo": "meteor-libretro"},
+    "mgba": {"repo": "mgba"},
+    "mupen64plus": {"repo": "mupen64plus-libretro-nx"},
+    "neocd": {"repo": "neocd_libretro"},
+    "nestopia": {"repo": "nestopia"},
+    "np2kai": {"repo": "NP2kai", "owner": "AZO234", "fetch_submodules": True},
+    "o2em": {"repo": "libretro-o2em"},
+    "opera": {"repo": "opera-libretro"},
+    "parallel-n64": {"repo": "parallel-n64"},
+    "pcsx2": {"repo": "pcsx2"},
+    "pcsx_rearmed": {"repo": "pcsx_rearmed"},
+    "picodrive": {"repo": "picodrive", "fetch_submodules": True},
+    "play": {"repo": "Play-", "owner": "jpd002", "fetch_submodules": True},
+    "ppsspp": {"repo": "ppsspp", "owner": "hrydgard", "fetch_submodules": True},
+    "prboom": {"repo": "libretro-prboom"},
+    "prosystem": {"repo": "prosystem-libretro"},
+    "quicknes": {"repo": "QuickNES_Core"},
+    "sameboy": {"repo": "sameboy"},
+    "scummvm": {"repo": "scummvm"},
+    "smsplus-gx": {"repo": "smsplus-gx"},
+    "snes9x": {"repo": "snes9x", "owner": "snes9xgit"},
+    "snes9x2002": {"repo": "snes9x2002"},
+    "snes9x2005": {"repo": "snes9x2005"},
+    "snes9x2010": {"repo": "snes9x2010"},
+    "stella": {"repo": "stella", "owner": "stella-emu"},
+    "stella2014": {"repo": "stella2014-libretro"},
+    "swanstation": {"repo": "swanstation"},
+    "tgbdual": {"repo": "tgbdual-libretro"},
+    "thepowdertoy": {"repo": "ThePowderToy"},
+    "tic80": {"repo": "tic-80", "fetch_submodules": True},
+    "vba-m": {"repo": "vbam-libretro"},
+    "vba-next": {"repo": "vba-next"},
+    "vecx": {"repo": "libretro-vecx"},
+    "virtualjaguar": {"repo": "virtualjaguar-libretro"},
+    "yabause": {"repo": "yabause"},
+}
+
+
+def info(*msg):
+    print(*msg, file=sys.stderr)
+
+
+def get_repo_hash_fetchFromGitHub(
+    repo,
+    owner="libretro",
+    deep_clone=False,
+    fetch_submodules=False,
+    leave_dot_git=False,
+    rev=None,
+):
+    extra_args = []
+    if deep_clone:
+        extra_args.append("--deep-clone")
+    if fetch_submodules:
+        extra_args.append("--fetch-submodules")
+    if leave_dot_git:
+        extra_args.append("--leave-dot-git")
+    if rev:
+        extra_args.append("--rev")
+        extra_args.append(rev)
+    result = subprocess.run(
+        ["nix-prefetch-github", owner, repo, *extra_args],
+        check=True,
+        capture_output=True,
+        text=True,
+    )
+    j = json.loads(result.stdout)
+    # Remove False values
+    return {k: v for k, v in j.items() if v}
+
+
+def get_repo_hash(fetcher="fetchFromGitHub", **kwargs):
+    if fetcher == "fetchFromGitHub":
+        return get_repo_hash_fetchFromGitHub(**kwargs)
+    else:
+        raise ValueError(f"Unsupported fetcher: {fetcher}")
+
+
+def get_repo_hashes(cores_to_update=[]):
+    with open(HASHES_PATH) as f:
+        repo_hashes = json.loads(f.read())
+
+    for core, repo in CORES.items():
+        if core in cores_to_update:
+            info(f"Getting repo hash for '{core}'...")
+            repo_hashes[core] = get_repo_hash(**repo)
+        else:
+            info(f"Skipping '{core}'...")
+
+    return repo_hashes
+
+
+def main():
+    # If you don't want to update all cores, pass the name of the cores you
+    # want to update on the command line. E.g.:
+    # $ ./update.py citra snes9x
+    if len(sys.argv) > 1:
+        cores_to_update = sys.argv[1:]
+    else:
+        cores_to_update = CORES.keys()
+
+    repo_hashes = get_repo_hashes(cores_to_update)
+    info(f"Generating '{HASHES_PATH}'...")
+    with open(HASHES_PATH, "w") as f:
+        f.write(json.dumps(dict(sorted(repo_hashes.items())), indent=4))
+        f.write("\n")
+    info("Finished!")
+
+
+if __name__ == "__main__":
+    main()