diff --git a/__pycache__/generate-manifest.cpython-314.pyc b/__pycache__/generate-manifest.cpython-314.pyc new file mode 100644 index 0000000..68052d7 Binary files /dev/null and b/__pycache__/generate-manifest.cpython-314.pyc differ 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)