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 */ }