From af59ab4a9d7377beb80f82a4c21113256b330e7a Mon Sep 17 00:00:00 2001 From: oliver Date: Sun, 27 Sep 2026 11:25:35 -0300 Subject: [PATCH] Update image manifest (1 image) --- __pycache__/generate-manifest.cpython-314.pyc | Bin 0 -> 8904 bytes generate-manifest.py | 23 +++++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 __pycache__/generate-manifest.cpython-314.pyc diff --git a/__pycache__/generate-manifest.cpython-314.pyc b/__pycache__/generate-manifest.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..68052d75b203ebaa9c265bb79faef5f03f83cbea GIT binary patch literal 8904 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 bF*y17>Z#14^^wnc$ItzDtb~7*&G>%-WQ{g} literal 0 HcmV?d00001 diff --git a/generate-manifest.py b/generate-manifest.py index 0dfef56..52d92d2 100755 --- a/generate-manifest.py +++ b/generate-manifest.py @@ -67,15 +67,31 @@ def find_images() -> list[dict]: return images -def write_manifest(images: list[dict]) -> None: +def write_manifest(images: list[dict]) -> bool: + """Write images.json. Returns True if the file changed. + + If the image list is identical to what's already on disk, the file is left + untouched (keeping its timestamp) so a no-op run produces no commit. + """ + plural = "" if len(images) == 1 else "s" + + if OUT_FILE.exists(): + try: + existing = json.loads(OUT_FILE.read_text(encoding="utf-8")) + except (json.JSONDecodeError, OSError): + existing = None + if isinstance(existing, dict) and existing.get("images") == images: + print(f"• Manifest unchanged ({len(images)} image{plural}).") + return False + manifest = { "generatedAt": datetime.now(timezone.utc).isoformat().replace("+00:00", "Z"), "count": len(images), "images": images, } OUT_FILE.write_text(json.dumps(manifest, indent=2, ensure_ascii=False) + "\n", encoding="utf-8") - plural = "" if len(images) == 1 else "s" print(f"✓ Wrote {len(images)} image{plural} to {OUT_FILE.name}") + return True def git(*args: str, check: bool = True) -> subprocess.CompletedProcess: @@ -117,7 +133,8 @@ def main() -> None: if args.no_commit: return - message = args.message or f"Update image manifest ({len(images)} images)" + plural = "" if len(images) == 1 else "s" + message = args.message or f"Update image manifest ({len(images)} image{plural})" commit(message)