File size: 1,616 Bytes
a4cdcc4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#!/usr/bin/env python3
"""Verify bundled PDC artifacts and portability-sensitive source files."""

from __future__ import annotations

import hashlib
import json
import sys
from pathlib import Path


ROOT = Path(__file__).resolve().parents[1]
MANIFEST = ROOT / "docs" / "artifacts.json"


def sha256(path: Path) -> str:
    digest = hashlib.sha256()
    with path.open("rb") as handle:
        for block in iter(lambda: handle.read(8 * 1024 * 1024), b""):
            digest.update(block)
    return digest.hexdigest()


def main() -> int:
    entries = json.loads(MANIFEST.read_text())
    failures = 0
    for entry in entries:
        path = ROOT / entry["path"]
        if not path.is_file():
            print(f"MISSING  {entry['path']}")
            failures += 1
            continue
        size_ok = path.stat().st_size == entry["bytes"]
        hash_ok = sha256(path) == entry["sha256"]
        state = "OK" if size_ok and hash_ok else "FAILED"
        print(f"{state:7}  {entry['path']}")
        failures += int(not (size_ok and hash_ok))

    private_roots = tuple("/" + stem for stem in ("scratch/", "Users/", "home/"))
    for path in list((ROOT / "smiles").rglob("*.py")) + list((ROOT / "scripts").rglob("*.py")):
        text = path.read_text(errors="replace")
        if any(root in text for root in private_roots):
            print(f"PRIVATE  {path.relative_to(ROOT)}")
            failures += 1

    print("Release verification passed." if not failures else f"Verification found {failures} problem(s).")
    return 1 if failures else 0


if __name__ == "__main__":
    raise SystemExit(main())