import { readFileSync } from 'node:fs'; import { describe, expect, it } from 'vitest'; /* * Befund 68 zur Fassung 5.10.0. * * `.gitattributes` fuehrte `*.lsap binary` unter der Ueberschrift * "Binaerdateien, die Git gar nicht anfassen darf" zwischen png, ico, pdf und * exe. Projektdateien sind aber reiner UTF-8-Text: Sie entstehen in * `tools/vierarmigerKnotenpunkt.ts` ueber `JSON.stringify(..., null, 2)` und * werden in `tests/domain/beispielprojekt.test.ts` mit `readFileSync(..., 'utf8')` * wieder eingelesen. * * `binary` ist die Kurzform fuer `-text -diff`; `git check-attr` lieferte fuer * die Datei "diff: unset". Damit zeigen `git diff`, `git show` und `git log -p` * fuer sie nur noch "Binary files ... differ", und ein Zusammenfuehren bricht in * den Konflikt statt zu mischen. Betroffen war ausgerechnet die eine erzeugte * Datei, deren Inhalt fachlich beurteilt werden muss - sie ist zugleich das * Pruefstueck fuer den Altdatei-Pfad (schemaVersion 7 gegen Programmstand 13). * * Das ist genau der Zustand, den der Kopf derselben Datei vermeiden will: "ein * Vergleich, den man nicht mehr lesen kann, ist als Nachweis wertlos". Das * Projekt hat diese Fehlerklasse schon einmal als Befund gefuehrt und behoben * (siehe tests/render/nullzeichen.test.ts). * * WARUM KEIN `git check-attr` IM TESTFALL: Der Zusammenhang zwischen `binary` * und der unlesbaren Vergleichsausgabe ist festgelegtes Verhalten von Git und * braucht keinen zweiten Nachweis. Bewacht wird die Ursache - dass eine * Textdatei des Baumes im Binaerblock steht. */ const ATTRIBUTE = readFileSync('.gitattributes', 'utf8'); const BEISPIEL = 'beispiele/vierarmiger-knotenpunkt.lsap'; /** Endungen, die `.gitattributes` als binaer fuehrt. */ function binaerEndungen(): string[] { const gefunden: string[] = []; for (const zeile of ATTRIBUTE.split('\n')) { const treffer = /^\*(\.[A-Za-z0-9]+)\s+binary\s*$/.exec(zeile.trim()); if (treffer) gefunden.push(treffer[1]!.toLowerCase()); } return gefunden; } describe('.gitattributes - die Projektdatei bleibt vergleichbar', () => { /* * Zuerst der Sachstand: Die Beispieldatei ist reiner Text. Waere sie eines * Tages wirklich binaer, faellt dieser Fall - und nicht der Abgleich darunter. */ it('ist die Beispiel-Projektdatei reiner UTF-8-Text', () => { const roh = readFileSync(BEISPIEL); expect(roh.includes(0), 'Nullbyte in der Projektdatei').toBe(false); const text = roh.toString('utf8'); expect(() => JSON.parse(text) as unknown, 'Projektdatei als JSON lesbar').not.toThrow(); expect(text.startsWith('{'), 'Projektdatei beginnt mit einer geschweiften Klammer').toBe(true); }); it('fuehrt die Endung .lsap nicht im Binaerblock', () => { expect(binaerEndungen(), 'als binaer gefuehrte Endungen').not.toContain('.lsap'); }); it('deckt die Regel fuer alle Dateien die Projektdatei ab', () => { // Ohne eigenen Eintrag greift die Sammelzeile - sie normiert auf LF und // laesst den Vergleich lesbar. expect(ATTRIBUTE).toMatch(/^\*\s+text=auto eol=lf\s*$/m); }); });