#!/usr/bin/env python3 """Generate Flatpak source entries for Cargo dependencies from Cargo.lock. Usage: python3 build-aux/flatpak-cargo-generator.py [Cargo.lock] \ > build-aux/cargo-sources.json """ import json import sys try: import tomllib except ImportError: try: import tomli as tomllib # pip install tomli except ImportError: print("Error: requires Python 3.11+ or the 'tomli' package", file=sys.stderr) sys.exit(1) CRATES_IO_DL = "https://static.crates.io/crates" REGISTRY_SOURCE = "registry+https://github.com/rust-lang/crates.io-index" def main() -> None: lockfile = sys.argv[1] if len(sys.argv) > 1 else "Cargo.lock" with open(lockfile, "rb") as f: lock = tomllib.load(f) sources = [] for pkg in lock.get("package", []): name = pkg["name"] version = pkg["version"] source = pkg.get("source", "") checksum = pkg.get("checksum") # Only vendor packages from crates.io (they have a checksum) if source == REGISTRY_SOURCE and checksum: sources.append( { "type": "archive", "archive-type": "tar-gz", "url": f"{CRATES_IO_DL}/{name}/{version}/download", "sha256": checksum, "dest": f"cargo-vendor/{name}-{version}", } ) print(json.dumps(sources, indent=2)) if __name__ == "__main__": main()