#!/usr/bin/env python3 """Печатает описание релиза в markdown по dist/metadata.json. python3 tools/release_notes.py <короткий-sha> [каталог-сборки] Отдельным скриптом, а не строчкой в CI: внутри YAML такой markdown пришлось бы экранировать до нечитаемости. """ from __future__ import annotations import json import sys from pathlib import Path def render(meta: dict, revision: str) -> str: lines = [f"Собрано из `{revision}`.", ""] lines += ["| Категория | Доменов |", "| --- | ---: |"] for name, count in meta["categories"].items(): lines.append(f"| {name} | {count} |") lines.append("") lines += ["| IP-категория | Сетей | Ограничения |", "| --- | ---: | --- |"] for name, info in meta["ip_categories"].items(): limits = " ".join(filter(None, ["/".join(info.get("network", [])), info.get("ports", "")])) lines.append(f"| {name} | {info['count']} | {limits or '—'} |") lines.append("") lines += [ f"sha256(discord-geosite.dat) = `{meta['geosite_dat_sha256']}`", "", f"sha256(discord-geoip.dat) = `{meta['geoip_dat_sha256']}`", ] return "\n".join(lines) + "\n" def main(argv: list[str]) -> int: sys.stdout.reconfigure(encoding="utf-8", errors="replace") # type: ignore[union-attr] if not 2 <= len(argv) <= 3: print(f"использование: {argv[0]} <короткий-sha> [каталог-сборки]", file=sys.stderr) return 1 out_dir = Path(argv[2]) if len(argv) == 3 else Path("dist") meta = json.loads((out_dir / "metadata.json").read_text(encoding="utf-8")) sys.stdout.write(render(meta, argv[1])) return 0 if __name__ == "__main__": raise SystemExit(main(sys.argv))