Prune card exports whose PNG is gone

Deleting a character in the UI left _text/cards/<Name>.json behind, describing a
card that no longer exists. A stale derived file is worse than a missing one
because it reads as current -- which is the exact reason the pre-commit hook
regenerates _text/ at all, so the script was failing its own premise.

Found by testing a deletion rather than reading the code. The write path was
obviously correct; the delete path had simply never been written.
This commit is contained in:
Mikkeli
2026-08-13 18:03:31 +09:00
parent 0b784be586
commit d00af71a91
3 changed files with 14 additions and 2 deletions
+2 -2
View File
@@ -1,6 +1,6 @@
{ {
"avatar": "none", "avatar": "Aino Vihtanen.png",
"chat": "Aino Vihtanen - 2026-08-12@16h09m13s142ms", "chat": "Aino Vihtanen - 2026-08-13@18h01m20s857ms",
"create_date": "2026-08-12T16:09:13.167Z", "create_date": "2026-08-12T16:09:13.167Z",
"creatorcomment": "", "creatorcomment": "",
"data": { "data": {
Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

After

Width:  |  Height:  |  Size: 92 KiB

+12
View File
@@ -92,6 +92,18 @@ def export_cards() -> int:
json.dump(card, fh, indent=2, ensure_ascii=False, sort_keys=True) json.dump(card, fh, indent=2, ensure_ascii=False, sort_keys=True)
fh.write("\n") fh.write("\n")
n += 1 n += 1
# ⚠ PRUNE EXPORTS WHOSE SOURCE IS GONE. Without this, deleting a character in
# the UI left `_text/cards/<Name>.json` behind describing a card that no
# longer exists — and it reads as current, which is worse than absent. Found
# by testing a deletion rather than by reading the code: the write path was
# obviously correct and the delete path was simply never written.
live = {f[:-4] + ".json" for f in os.listdir(src)
if f.lower().endswith(".png") and not f.startswith("default_")} if os.path.isdir(src) else set()
for stale in sorted(set(os.listdir(dst)) - live):
if stale.endswith(".json"):
os.remove(os.path.join(dst, stale))
print(f" pruned _text/cards/{stale} — its PNG is gone")
return n return n