# -*- coding: utf-8 -*- """Pruefstand: passt das VEROEFFENTLICHTE Release zu dem, was der Updater sucht? DER FALL, DER DAZU GEFUEHRT HAT (06.09.2026) -------------------------------------------- Das Release war angelegt, die EXE hing dran - und der Updater haette trotzdem nie etwas gefunden. Der Anhang hiess `Rechnungstool-1.7.0.exe`; gesucht wird aber `Rechnungstool.exe` (so steht es in version.EXE_NAME, und danach sucht passendes_release). Die Nummer kommt erst beim ABLEGEN dazu. Das Tueckische daran: nichts schlaegt fehl. Der Updater meldet freundlich "Aktuell. Kein Update noetig." und startet die alte Fassung. Ein Update, das stumm nie ankommt, ist schlimmer als eines, das laut scheitert. Zweiter Fund derselben Runde: die Pruefsummen standen nur im Release-TEXT. Der Updater liest sie aus einer angehaengten Datei `.sha256`. Ohne die prueft er nur die Groesse - und eine unterwegs verfaelschte Datei hat genau die richtige Groesse. WAS HIER GEPRUEFT WIRD ---------------------- Gegen das echte Repository, nicht gegen einen Nachbau: 1. Zu der Nummer in version.py gibt es ein Release. 2. Es haengt eine Datei mit EXAKT dem Namen aus version.EXE_NAME an. 3. Es haengt die Pruefsumme `.sha256` an. 4. Die Summe darin ist die der angehaengten Datei - und die stimmt mit dem ueberein, was hier zuletzt gebaut wurde (release/). 5. passendes_release() findet dieses Release auch wirklich. Ohne Netz wird uebersprungen statt rot gemeldet: ein fehlender Anschluss ist kein Fehler des Programms. """ import os import sys HIER = os.path.dirname(os.path.abspath(__file__)) sys.path.insert(0, HIER) import updater # noqa: E402 import version # noqa: E402 from pruefhelfer import fehler, pruefe try: releases = updater.releases_holen(version.REPOSITORY) except Exception as e: # noqa: BLE001 - ohne Netz ist hier nichts zu pruefen print(f"UEBERSPRUNGEN | Repository nicht erreichbar ({e})") sys.exit(0) marke = "v" + version.VERSION dieses = next((r for r in releases if (r.get("tag_name") or "") == marke), None) pruefe(dieses is not None, f"zu Fassung {version.VERSION} gibt es ein Release ({marke})") if dieses is None: print("ROT | ohne Release ist der Rest nicht pruefbar") sys.exit(1) roh = dieses.get("assets") or [] anhaenge = {a.get("name"): a for a in roh} # Doppelte Namen: Forgejo laesst zwei Anhaenge mit demselben Namen zu. Beim # Ersetzen einer Datei blieb die alte einmal stehen (07.09.2026), und welche # von beiden der Updater dann laedt, ist Glueckssache - unter Umstaenden die # alte, mit der falschen Pruefsumme daneben. doppelt = sorted({a["name"] for a in roh if sum(1 for b in roh if b["name"] == a["name"]) > 1}) pruefe(not doppelt, f"kein Anhang haengt doppelt am Release ({doppelt})") print(f" (Anhaenge: {', '.join(sorted(anhaenge)) or 'keine'})") pruefe(version.EXE_NAME in anhaenge, f"der Anhang heisst genau {version.EXE_NAME} - danach sucht der Updater") pruefe(version.EXE_NAME + ".sha256" in anhaenge, f"die Pruefsumme haengt als {version.EXE_NAME}.sha256 dran") # ---- Die Summe muss zur Datei passen, und zwar zu der gebauten ------------ gebaut = os.path.join(HIER, "release", version.EXE_NAME) url_summe = updater.summe_aus_release(dieses, version.EXE_NAME) if url_summe: veroeffentlicht = updater.text_holen(url_summe).strip().split()[0] if os.path.exists(gebaut): pruefe(veroeffentlicht == updater.sha256(gebaut), "die veroeffentlichte Summe ist die der zuletzt gebauten Datei") else: print(f" (release/{version.EXE_NAME} fehlt - Summe nicht " f"gegenpruefbar, vorher: python bauen.py)") pruefe(len(veroeffentlicht) == 64 and all(c in "0123456789abcdef" for c in veroeffentlicht), f"und sie sieht aus wie eine SHA256 ({veroeffentlicht[:16]}...)") # ---- Und findet der Updater das Release ueberhaupt? ----------------------- treffer = updater.passendes_release(releases, version.EXE_NAME) pruefe(treffer is not None, "passendes_release findet ueberhaupt ein Release") if treffer: pruefe((treffer[0].get("tag_name") or "") == marke, f"und zwar dieses hier ({treffer[0].get('tag_name')})") if fehler: print(f"ROT | {len(fehler)} Punkt(e) nicht erfuellt") sys.exit(1) print("GRUEN | Das Release ist so, wie der Updater es erwartet")