nixpkgs mirror (for testing)
github.com/NixOS/nixpkgs
nix
1#! /usr/bin/env nix-shell
2#! nix-shell -i python3 --packages python3 nix-prefetch-git
3
4import argparse
5import json
6import subprocess
7from pathlib import Path
8
9
10def fetch_git_hash(url: str, rev: str) -> str:
11 result = subprocess.run(
12 ["nix-prefetch-git", "--url", url, "--rev", rev],
13 capture_output=True,
14 text=True,
15 check=True,
16 )
17 return json.loads(result.stdout)["hash"]
18
19
20def main() -> None:
21 parser = argparse.ArgumentParser()
22 parser.add_argument(
23 "-i",
24 "--input",
25 type=Path,
26 default=Path(__file__).parent.resolve() / "pubspec.lock.json",
27 )
28 parser.add_argument("-o", "--output", type=Path, default=None)
29 args = parser.parse_args()
30 output_file: Path | None = args.output
31 output: dict[str, str] = {}
32 for name, info in json.loads(args.input.read_text()).get("packages", {}).items():
33 if info.get("source") != "git":
34 continue
35 desc = info.get("description")
36 if not isinstance(desc, dict):
37 continue
38 url = desc.get("url")
39 rev = desc.get("resolved-ref")
40 if not (isinstance(url, str) and isinstance(rev, str)):
41 continue
42 output[name] = fetch_git_hash(url, rev)
43 output_json = json.dumps(output, indent=2, sort_keys=True) + "\n"
44 if output_file:
45 output_file.write_text(output_json)
46 else:
47 print(output_json, end="")
48
49
50if __name__ == "__main__":
51 main()