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 <[email protected]>
This commit is contained in:
@@ -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 */ }
|
||||
|
||||
Reference in New Issue
Block a user