diff --git a/VERSION b/VERSION index 88c5fb8..347f583 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.4.0 +1.4.1 diff --git a/docs/STATUS.md b/docs/STATUS.md index 7174487..4f2e10e 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -37,6 +37,7 @@ Erster Commit angelegt (`82b0782`); das Projekt hat damit einen Rückfallpunkt. - **Das erste Bild einer Seite lädt sofort**, alles darunter weiterhin verzögert. Es ist meistens das größte Ding über der Falz. - **Slider mit Punkten ohne Skript** (ADR 044): `::scroll-marker` zeichnet je Folie einen Punkt, der aktive ist erkennbar, die Rollleiste entfällt; ältere Browser behalten das wischbare Schiebefeld. Beitragskarten sind echte Karten (Bild 16:10, 18 px Ecken). Überschriften dürfen ein Wort hervorheben (``, in Akzentfarbe). Behoben: die Theme-Schriftskala überschrieb die Größen in Karten und Aufruf-Bändern. - **„Weiterlesen" ist jetzt ein Link.** In der wechselseitigen Beitragsliste stand dort eine reine Beschriftung: sie sah aus wie ein Knopf und war keiner. Der Titel steckt für Vorlesesoftware im Linktext, damit nicht zwölf Links gleich heißen. +- **Behoben in 1.4.1: dem Releasearchiv fehlten `migrations.php` und `cli-config.php`.** Auf dem Hosting brach die Installation deshalb im dritten Schritt ab – „The configuration file does not exist", genau dort, wo die Tabellen entstehen sollten. Die beiden Dateien standen weder in der Mitnahme- noch in der Ausschlussliste des Releaseskripts, also fiel niemandem auf, dass sie fehlen. Ein Test ordnet jetzt **jeden** Eintrag im Projektstamm einer der beiden Listen zu; was neu dazukommt und unbedacht bleibt, lässt ihn fehlschlagen. Der Installationsweg wurde anschließend vollständig durchgespielt: 3504 Dateien entpackt, 14 Migrationen ausgeführt, 15 Tabellen angelegt. - **Fassung 1.4.0 ist veröffentlicht** und der Installationsweg einmal vollständig durchgespielt: `install.php` aus dem Release geladen (anonym, ohne Anmeldung), in ein leeres Verzeichnis gelegt, aufgerufen – es lädt `kantsites-1.4.0.zip` (4,7 MB, 3502 Dateien mit `vendor/`), prüft die SHA-256-Summe, entpackt und löscht sich selbst. Die frische Installation antwortet mit der Systemprüfung unter `/install`. **Das Repository ist dafür öffentlich** – ein privates liefert die Downloadadresse ohne Anmeldung nicht aus. - **Die Verwaltung kann umziehen** (ADR 065): `php bin/console cms:admin:path meine-verwaltung` legt sie auf eine andere Adresse – geprüft wird, dass der Name frei ist und keine Seite verdeckt. Der Wert steht in `.env.local` und gilt für Routen, Firewall, Schutzkopfzeilen und Statistik. **In der `robots.txt` wird ein geänderter Name nicht genannt**; beim Standardnamen `admin` bleibt die Zeile, weil diese Adresse ohnehin bekannt ist. Die Systemseite zeigt die aktuelle Adresse an. - **Dokumentschema v19**: Baustein **Rechtszeile** (Impressum, Datenschutz, „Einwilligung ändern") für den Fußbereich – gestaltbar und an der richtigen Stelle statt als heller Streifen unter einem dunklen Fuß; die eingebaute Leiste erscheint nur noch, wenn die Seite den Baustein nicht hat. Dazu **„Beim Klick"** je Bild (nichts / vergrößern / Adresse) und **„Bilder vergrößerbar"** je Galerie. diff --git a/scripts/build-release.php b/scripts/build-release.php index 2f1be29..e10da6a 100644 --- a/scripts/build-release.php +++ b/scripts/build-release.php @@ -64,8 +64,11 @@ if (!is_dir($outDirectory) && !mkdir($outDirectory, 0o775, true)) { echo "Fassung {$version}\n"; // What belongs into a release: the application, and nothing that only a developer needs. -$include = ['bin', 'config', 'migrations', 'public', 'src', 'templates', 'composer.json', 'composer.lock', 'VERSION', 'README.md', 'LICENSE', '.env.example']; -$skip = ['.git', '.github', 'node_modules', 'var', 'tests', 'scripts', 'reports', 'phpunit.xml.dist', '.php-cs-fixer.dist.php', 'package.json', 'package-lock.json']; +// migrations.php und cli-config.php gehoeren dazu: ohne die erste findet Doctrine beim +// Einrichten keine Migrationsliste und bricht mit "configuration file does not exist" ab - genau +// dort, wo eine frische Installation ihre Tabellen anlegen will. +$include = ['bin', 'config', 'migrations', 'public', 'src', 'templates', 'composer.json', 'composer.lock', 'migrations.php', 'cli-config.php', 'VERSION', 'README.md', 'LICENSE', '.env.example']; +$skip = ['.git', '.github', '.claude', '.gitattributes', '.gitignore', '.php-cs-fixer.cache', 'node_modules', 'var', 'tests', 'scripts', 'reports', 'phpunit.xml.dist', '.php-cs-fixer.dist.php', 'package.json', 'package-lock.json', 'AGENTS.md', 'ENTWICKLUNGSPLAN.md', 'docs', 'composer.phar', '.venv', 'vendor', 'phpunit.cache', 'migrations.php.bak']; $copy = static function (string $from, string $to) use (&$copy, $skip): int { $count = 0; diff --git a/tests/CmsTest.php b/tests/CmsTest.php index 0518ee7..89cf451 100644 --- a/tests/CmsTest.php +++ b/tests/CmsTest.php @@ -1047,6 +1047,36 @@ final class CmsTest extends TestCase } } + public function testTheReleaseArchiveCarriesEveryFileTheApplicationNeeds(): void + { + // Auf dem Hosting gefunden, nicht hier: „The configuration file does not exist" beim + // Anlegen der Tabellen. Im Releasearchiv fehlte migrations.php - die Datei, die Doctrine + // sagt, wo die Migrationen liegen. Sie stand weder in der Mitnahmeliste noch in der + // Ausschlussliste, also fiel niemandem auf, dass sie fehlt. + $skript = (string) file_get_contents(__DIR__.'/../scripts/build-release.php'); + preg_match('/\$include = \[(.+?)\];/s', $skript, $mit); + preg_match('/\$skip = \[(.+?)\];/s', $skript, $ohne); + self::assertNotEmpty($mit, 'Die Mitnahmeliste des Releaseskripts ist nicht auffindbar.'); + $liste = static fn (string $roh): array => array_map( + static fn (string $eintrag): string => trim($eintrag, " ' + "), + explode(',', preg_replace('#//[^ +]*#', '', $roh) ?? ''), + ); + $eingeordnet = [...$liste($mit[1]), ...$liste($ohne[1] ?? ''), '.env', '.env.local', 'LICENSE']; + + foreach (scandir(__DIR__.'/..') ?: [] as $eintrag) { + if (in_array($eintrag, ['.', '..'], true) || str_starts_with($eintrag, '.git')) { + continue; + } + self::assertContains( + $eintrag, + $eingeordnet, + sprintf('„%s" steht im Projektstamm, aber weder in der Mitnahme- noch in der Ausschlussliste von build-release.php. Ein Release ohne diese Datei fällt erst auf dem Hosting auf.', $eintrag), + ); + } + } + public function testNoStylesheetHasADanglingSelector(): void { // Gefunden, als der Einwilligungsdialog plötzlich ungestaltet unter dem Fuß stand: beim