1#! /usr/bin/env nix-shell
2#! nix-shell -i python3 -p python3 prefetch-yarn-deps nix-prefetch-git nix-prefetch
3
4from pathlib import Path
5from shutil import copyfile
6from urllib.request import Request, urlopen
7import json
8import os
9import subprocess
10
11
12def run_external(args: list[str]):
13 proc = subprocess.run(
14 args,
15 check=True,
16 stdout=subprocess.PIPE,
17 )
18
19 return proc.stdout.strip().decode("utf8")
20
21def get_latest_release_tag():
22 req = Request("https://api.github.com/repos/stashapp/stash/tags?per_page=1")
23
24 if "GITHUB_TOKEN" in os.environ:
25 req.add_header("authorization", f"Bearer {os.environ['GITHUB_TOKEN']}")
26
27 with urlopen(req) as resp:
28 return json.loads(resp.read())[0]
29
30def prefetch_github(rev: str):
31 print(f"Prefetching stashapp/stash({rev})")
32
33 proc = run_external(["nix-prefetch-git", "--no-deepClone", "--rev", rev, f"https://github.com/stashapp/stash"])
34
35 return json.loads(proc)
36
37def prefetch_yarn(lock_file: str):
38 print(f"Prefetching yarn deps")
39
40 hash = run_external(["prefetch-yarn-deps", lock_file])
41
42 return run_external(["nix", "hash", "convert", "--hash-algo", "sha256", hash])
43
44def prefetch_go_modules(src: str, version: str):
45 print(f"Prefetching go modules")
46 expr = fr"""
47 {{ sha256 }}: (buildGoModule {{
48 pname = "stash";
49 src = {src};
50 version = "{version}";
51 vendorHash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
52 }}).goModules.overrideAttrs (_: {{ modSha256 = sha256; }})
53 """
54 return run_external([
55 "nix-prefetch",
56 "--option",
57 "extra-experimental-features",
58 "flakes",
59 expr
60 ])
61
62
63def save_version_json(version: dict[str, str]):
64 print("Writing version.json")
65 with open(Path(__file__).parent / "version.json", 'w') as f:
66 json.dump(version, f, indent=2)
67 f.write("\n")
68
69if __name__ == "__main__":
70 release = get_latest_release_tag()
71
72 src = prefetch_github(release['name'])
73
74 yarn_hash = prefetch_yarn(f"{src['path']}/ui/v2.5/yarn.lock")
75
76 save_version_json({
77 "version": release["name"][1:],
78 "gitHash": release["commit"]["sha"][:8],
79 "srcHash": src["hash"],
80 "yarnHash": yarn_hash,
81 "vendorHash": prefetch_go_modules(src["path"], release["name"][1:])
82 })