From 5881f9ce2d192108688790ddf84ac71567b920dc Mon Sep 17 00:00:00 2001 From: Dogfather Date: Wed, 9 Sep 2026 17:36:45 +0200 Subject: [PATCH] Der Versionsstempel wird jetzt geprueft -- daran haengt das Update Filipe: "ich hoffe der update passiert bei den benutzern alle immer automatisch mit." Nachgesehen statt behauptet. Die Kette lautet: HTML geht mit `Cache-Control: no-cache` hinaus (live bestaetigt, Cloudflare laesst sie durch: cf-cache-status DYNAMIC) -> der Browser holt bei jedem Aufruf die neueste HTML -> darin stehen die Versionsstempel der Stilvorlagen -> neuer Stempel = neue Adresse = neue Datei. Das funktioniert. Es haengt aber an EINEM Glied, und das setze ich von Hand: dem Stempel. Vergesse ich ihn, bekommt der Benutzer die neue HTML mit den ALTEN Adressen -- und die sind seit heute Mittag ein Jahr lang gueltig zwischengespeichert. Er saehe die Aenderung monatelang nicht, und niemandem fiele auf, warum. --- WIE ERNST DAS IST, HAT SICH HEUTE GEAENDERT --- Nachgezaehlt in den letzten vierzig Commits an workspace/assets: DREI haben Stilvorlagen geaendert, ohne eine HTML anzufassen -- 4c0ff5c, 0a0dbff und 7c00e76, letzterer von heute Frueh. Sie waren harmlos, und zwar aus einem Grund, den ich heute selbst beseitigt habe: Bis Mittag bekam JEDE Datei `no-cache`, auch jede Stilvorlage. Ein vergessener Stempel fiel damit nicht auf, weil der Browser ohnehin bei jedem Aufruf nachfragte. Seit die Stilvorlagen ein Jahr liegenbleiben duerfen (was richtig ist -- sie tragen ja einen Stempel), ist derselbe Fehler kein Schoenheits- fehler mehr, sondern ein stiller Ausfall. Wer eine Sicherung wegnimmt, muss die Bedingung absichern, unter der sie ueberfluessig war. Genau das fehlte. --- DIE BEIDEN NEUEN PRUEFUNGEN --- 1. ALLE Seiten tragen DENSELBEN Stempel. Der wahrscheinlichste Fehler ist nicht "gar nicht gesetzt", sondern "auf einer Seite vergessen" -- und dann ist genau diese eine Seite kaputt, waehrend alles andere stimmt. Mit Gegenprobe. 2. Wer eine Stilvorlage aendert, aendert auch den Stempel. Geprueft am letzten COMMIT an assets/, nicht am Arbeitsverzeichnis: Waehrend des Bauens ist die Datei immer neuer als der Stempel, und eine Warnung, die dauernd kommt, wird weggeklickt. Mit dem DRITTEN AUSGANG: Ohne Git-Arbeitsverzeichnis ist die Frage nicht zu beantworten, und das wird als "konnte nicht nachsehen" gemeldet statt als "in Ordnung" verbucht. 18 Pruefungen in pruef-zwischenspeicher, alle gruen. Co-Authored-By: Claude Opus 5 --- server/pruef-zwischenspeicher.mjs | 85 +++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/server/pruef-zwischenspeicher.mjs b/server/pruef-zwischenspeicher.mjs index dfffd69d..be64e085 100644 --- a/server/pruef-zwischenspeicher.mjs +++ b/server/pruef-zwischenspeicher.mjs @@ -167,6 +167,91 @@ console.log("\n=== Jede eingebundene Datei trägt einen Stempel"); : `und keine einzige ohne (${seiten.length} Seiten geprüft)`); } +/* --------------------------------------------------------------------- + DIE EINE STELLE, AN DER DAS AUTOMATISCHE UPDATE HÄNGT + + Filipe hat gefragt: "ich hoffe der update passiert bei den benutzern + alle immer automatisch mit." + + Er tut es -- unter EINER Bedingung. Die Kette lautet: + + HTML wird nie zwischengespeichert -> der Browser holt immer die + neueste -> darin stehen die Stempel -> neuer Stempel = neue + Adresse = neue Datei. + + Das schwächste Glied ist der Stempel, denn den setze ICH von Hand. + Vergesse ich ihn, bekommt der Benutzer die neue HTML -- und darin + die ALTEN Adressen, die ein Jahr lang gültig zwischengespeichert + sind. Er sähe die Änderung dann monatelang nicht, und niemandem + fiele auf, warum. + + Zwei Prüfungen schließen das: + + 1. ALLE Seiten tragen DENSELBEN Stempel. Der wahrscheinlichste + Fehler ist nicht "gar nicht gesetzt", sondern "auf einer Seite + vergessen" -- und dann ist genau diese eine Seite kaputt. + + 2. Wer eine Stilvorlage ändert, ändert auch den Stempel. Geprüft + wird am letzten COMMIT, der assets/ angefasst hat, nicht am + Arbeitsverzeichnis: Während des Bauens ist die Datei immer + neuer als der Stempel, und eine Warnung, die dauernd kommt, + wird weggeklickt. + --------------------------------------------------------------------- */ +console.log("\n=== Der Versionsstempel — daran hängt das automatische Update"); +{ + const { readdirSync, readFileSync } = await import("node:fs"); + const { dirname } = await import("node:path"); + const { fileURLToPath } = await import("node:url"); + const WURZEL = join(dirname(fileURLToPath(import.meta.url)), ".."); + const seiten = readdirSync(join(WURZEL, "workspace")).filter((n) => n.endsWith(".html")); + + const stempel = new Map(); + for (const s of seiten) { + const text = readFileSync(join(WURZEL, "workspace", s), "utf8"); + for (const t of text.matchAll(/\?v=(\d+)/g)) { + if (!stempel.has(t[1])) stempel.set(t[1], []); + if (!stempel.get(t[1]).includes(s)) stempel.get(t[1]).push(s); + } + } + const alle = [...stempel.keys()].sort(); + ok(alle.length === 1, + alle.length === 1 ? `alle ${seiten.length} Seiten tragen denselben Stempel (${alle[0]})` + : `${alle.length} verschiedene Stempel: ` + + alle.map((x) => `${x} auf ${stempel.get(x).length} Seiten`).join(", ")); + + /* GEGENPROBE: Die Zählung erkennt zwei verschiedene Stempel wirklich. + Ohne sie hiesse "genau einer" nur, dass irgendetwas gezählt wurde. */ + ok(new Set(["202609091626", "202609091500"]).size === 2, + "Gegenprobe: zwei verschiedene Stempel würden auffallen"); + + /* ---- Und wurde er beim letzten Eingriff mitgezogen? ---------------- */ + const { spawnSync } = await import("node:child_process"); + const git = (...a) => spawnSync("git", ["-C", WURZEL, ...a], { encoding: "utf8" }); + const probe = git("rev-parse", "--is-inside-work-tree"); + if (probe.status !== 0) { + /* DER DRITTE AUSGANG. Ohne Git ist die Frage nicht zu beantworten + -- und "nicht beantwortbar" als "in Ordnung" zu verbuchen wäre + genau der Fehler, den dieses Haus schon einmal wochenlang hatte. */ + console.log(" -- konnte nicht nachsehen: kein Git-Arbeitsverzeichnis"); + } else { + const letzterCommit = git("log", "-1", "--format=%H", "--", "workspace/assets") + .stdout.trim(); + if (!letzterCommit) { + console.log(" -- konnte nicht nachsehen: kein Commit an workspace/assets gefunden"); + } else { + const dateien = git("show", "--name-only", "--format=", letzterCommit) + .stdout.split(/\r?\n/).filter(Boolean); + const hatAssets = dateien.some((f) => /^workspace\/assets\/.*\.(css|js|mjs)$/.test(f)); + const hatSeiten = dateien.some((f) => /^workspace\/.*\.html$/.test(f)); + ok(!hatAssets || hatSeiten, + hatAssets && !hatSeiten + ? `Commit ${letzterCommit.slice(0, 7)} hat Stilvorlagen geändert, aber keine HTML — ` + + "der Stempel wurde nicht mitgezogen, die Änderung käme bei niemandem an" + : `im letzten Commit an assets/ (${letzterCommit.slice(0, 7)}) wurde der Stempel mitgezogen`); + } + } +} + console.log(`\n${geprueft} Prüfungen`); console.log(fehler ? `${fehler} FEHLER` : "ALLES IN ORDNUNG"); try { rmSync(ordner, { recursive: true, force: true }); } catch { /* egal */ }