Ursprüngliche Informationen in Metafile speichern #83

Closed
opened 2026-09-13 19:46:53 +02:00 by admin · 1 comment

Texturen und Fonts werde mit hash filename abgespeichert, daneben wäre ein gleichnamiges meta json gut mit informationen die nützlich sind, wenn man ein asset erstellt und eine vorhandene texture/font auswählt. am wichtigsten wäre der ursprüngliche dateiname, mehr informationen brauchen wir eigentlich nicht.

Texturen und Fonts werde mit hash filename abgespeichert, daneben wäre ein gleichnamiges meta json gut mit informationen die nützlich sind, wenn man ein asset erstellt und eine vorhandene texture/font auswählt. am wichtigsten wäre der ursprüngliche dateiname, mehr informationen brauchen wir eigentlich nicht.
admin added this to the Development project 2026-09-13 19:46:53 +02:00
admin moved this to Next in Development on 2026-09-13 19:46:58 +02:00
admin added the high-priority label 2026-09-13 19:47:05 +02:00
Owner

Umgesetzt in 99c5d2a, Wiki 4619f61.

Zuschnitt

Der Name reist als &name= neben den rohen Bytes mit und liegt als {file}.json neben der inhaltsadressierten Datei; GET ?r=textures und ?r=fonts geben ihn mit aus. Mehr wird nicht gespeichert — Breite, Höhe und Größe kommen wie bisher aus der Datei selbst.

Deine Regel: der letzte Upload gewinnt. Dieselben Bytes noch einmal unter anderem Namen hochgeladen, benennen um, was die Picker zeigen. Ein Upload ohne Namen löscht den bekannten nicht. Eine Datei von vorher hat schlicht "" und liest sich wie eh und je.

Der Server nimmt den Namen nicht ungeprüft: Verzeichnisse, Steuerzeichen und ungültiges UTF-8 fallen weg, bei 120 Zeichen wird gekappt. Die Sidecar ist bewusst nicht autoritativ — fehlt sie, ist sie unlesbar oder leer, heißt das „kein Name bekannt“.

Was man davon sieht

vorher jetzt
Kachel im Bild-Picker 100 × 100 hero-idle.png
Zeile im Font-Picker nur die Beispielschrift DejaVuSerif.ttf
Asset aus dem Picker Texture 2 / Font hero-idle / DejaVuSerif

Eine Kachel, die dieses Projekt schon trägt, zeigt weiterhin ihren Assetnamen — die Unterscheidung bleibt sichtbar.

Geprüft, nicht behauptet

Gate === CHECK EXIT 0 ===, 887 Tests (+5)
e2e, voller Lauf ALL PASSED – 780 checks (775 + 5 neue, einer umgeschrieben)
Die drei Spiele 24 / 19 / 21, === SMOKES EXIT 0 ===

Drei Gegenproben, jede beißt an ihrer Stelle:

  1. OriginalName::read stumpf auf '' → genau die 6 Checks um Beschriftung und Benennung fallen, die anderen 62 bleiben grün.
  2. buildTextureAsset wieder mit {...image} → genau der neue Unit-Test fällt (1 von 6): expected 'hero-idle.png' to be 'Hero'.
  3. Existenzprüfung zurück auf @file_get_contents → GET ?r=textures HTTP 500, ?r=fonts ebenso; mit der Prüfung beide 200.

Zwei Funde, die der Bau gekostet hat

buildTextureAsset spreadete das Upload-Ergebnis ({...image}). Das neue Feld name hätte damit still den Assetnamen gekapert — der erste Testlauf zeigte name: "". Die Felder werden jetzt einzeln kopiert, ein Test nagelt es fest.

@ schützt hier nicht. api/index.php installiert einen eigenen set_error_handler, der error_reporting() nicht konsultiert — eine unterdrückte Warnung wirft trotzdem. Eine fehlende Sidecar-Datei hat damit die ganze Texturliste mit 500 gekippt (in den php-fpm-Logs bestätigt). Jetzt wird die Existenz geprüft statt die Warnung unterdrückt. Das gilt für jedes @ in dieser API.

Grenze

Die 9 Texturen und 3 Fonts, die vor dieser Änderung hochgeladen wurden, haben keinen Namen mehr — der ist unwiederbringlich weg. Sie lesen sich wie bisher (Pixelmaß bzw. nichts).

Wiki: API (Spalten und die Regeln), Textures, Fonts, Architecture, Development.

Umgesetzt in **99c5d2a**, Wiki **4619f61**. ## Zuschnitt Der Name reist als `&name=` neben den rohen Bytes mit und liegt als `{file}.json` neben der inhaltsadressierten Datei; `GET ?r=textures` und `?r=fonts` geben ihn mit aus. Mehr wird nicht gespeichert — Breite, Höhe und Größe kommen wie bisher aus der Datei selbst. **Deine Regel: der letzte Upload gewinnt.** Dieselben Bytes noch einmal unter anderem Namen hochgeladen, benennen um, was die Picker zeigen. Ein Upload *ohne* Namen löscht den bekannten nicht. Eine Datei von vorher hat schlicht `""` und liest sich wie eh und je. Der Server nimmt den Namen nicht ungeprüft: Verzeichnisse, Steuerzeichen und ungültiges UTF-8 fallen weg, bei 120 Zeichen wird gekappt. Die Sidecar ist bewusst **nicht autoritativ** — fehlt sie, ist sie unlesbar oder leer, heißt das „kein Name bekannt“. ## Was man davon sieht | | vorher | jetzt | |---|---|---| | Kachel im Bild-Picker | `100 × 100` | `hero-idle.png` | | Zeile im Font-Picker | nur die Beispielschrift | `DejaVuSerif.ttf` | | Asset aus dem Picker | `Texture 2` / `Font` | `hero-idle` / `DejaVuSerif` | Eine Kachel, die dieses Projekt schon trägt, zeigt weiterhin ihren **Asset**namen — die Unterscheidung bleibt sichtbar. ## Geprüft, nicht behauptet | | | |---|---| | Gate | `=== CHECK EXIT 0 ===`, **887 Tests** (+5) | | e2e, voller Lauf | **ALL PASSED – 780 checks** (775 + 5 neue, einer umgeschrieben) | | Die drei Spiele | **24 / 19 / 21**, `=== SMOKES EXIT 0 ===` | **Drei Gegenproben, jede beißt an ihrer Stelle:** 1. `OriginalName::read` stumpf auf `''` → genau die **6** Checks um Beschriftung und Benennung fallen, die anderen 62 bleiben grün. 2. `buildTextureAsset` wieder mit `{...image}` → genau der neue Unit-Test fällt (1 von 6): `expected 'hero-idle.png' to be 'Hero'`. 3. Existenzprüfung zurück auf `@file_get_contents` → `GET ?r=textures` **HTTP 500**, `?r=fonts` ebenso; mit der Prüfung beide 200. ## Zwei Funde, die der Bau gekostet hat **`buildTextureAsset` spreadete das Upload-Ergebnis** (`{...image}`). Das neue Feld `name` hätte damit still den *Asset*namen gekapert — der erste Testlauf zeigte `name: ""`. Die Felder werden jetzt einzeln kopiert, ein Test nagelt es fest. **`@` schützt hier nicht.** `api/index.php` installiert einen eigenen `set_error_handler`, der `error_reporting()` nicht konsultiert — eine unterdrückte Warnung wirft trotzdem. Eine fehlende Sidecar-Datei hat damit die **ganze Texturliste** mit 500 gekippt (in den php-fpm-Logs bestätigt). Jetzt wird die Existenz geprüft statt die Warnung unterdrückt. Das gilt für jedes `@` in dieser API. ## Grenze Die 9 Texturen und 3 Fonts, die vor dieser Änderung hochgeladen wurden, haben keinen Namen mehr — der ist unwiederbringlich weg. Sie lesen sich wie bisher (Pixelmaß bzw. nichts). Wiki: *API* (Spalten und die Regeln), *Textures*, *Fonts*, *Architecture*, *Development*.
admin moved this to Done in Development on 2026-09-13 20:53:13 +02:00
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: meleki/feuerwerk#83