Clone of https://github.com/NixOS/nixpkgs.git (to stress-test knotserver)
1import base64
2import binascii
3import configparser
4import json
5import pathlib
6import sys
7import urllib.parse
8
9
10def to_sri(hash: str):
11 raw = binascii.unhexlify(hash)
12 b64 = base64.b64encode(raw).decode()
13 return f"sha256-{b64}"
14
15
16def main(dir: str):
17 result = []
18 for file in (pathlib.Path(dir) / "subprojects").glob("*.wrap"):
19 name = file.stem
20 parser = configparser.ConfigParser()
21 _ = parser.read(file)
22 sections = parser.sections()
23 if "wrap-file" not in sections:
24 continue
25
26 url = parser.get("wrap-file", "source_url")
27 if "crates.io" not in url:
28 continue
29
30 parsed = urllib.parse.urlparse(url)
31 path = parsed.path.split("/")
32 assert path[4] == name
33 version = path[5]
34
35 hash = to_sri(parser.get("wrap-file", "source_hash"))
36
37 result.append({
38 "pname": name,
39 "version": version,
40 "hash": hash,
41 })
42
43 here = pathlib.Path(__file__).parent
44 with (here / "wraps.json").open("w") as fd:
45 json.dump(result, fd, indent=4)
46 _ = fd.write("\n")
47
48
49if __name__ == '__main__':
50 main(*sys.argv[1:])