"""Content hash of the packaged python tree.
The remote plugin stages a bundle under this hash, and a detached kernel and
its bridge announce it, so the daemon can tell when a kernel runs older code
than the daemon's own tree.
"""
from __future__ import annotations
import hashlib
from pathlib import Path
ROOT = Path(__file__).resolve().parent
def digest(root: Path = ROOT) -> str:
"""sha256 over every .py file's relative path and bytes, in path order."""
hasher = hashlib.sha256()
for path in sorted(root.rglob("*.py")):
hasher.update(str(path.relative_to(root)).encode())
hasher.update(path.read_bytes())
return hasher.hexdigest()