wikitool: --set kann keine Array-Werte mit Komma ausdrücken
#12
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem
_coerce_set_value()reicht jeden Wert eines Array-Feldes ancommands/_util.parse_list()weiter, das hart an,splittet:Es gibt kein Escape und keine Alternative. Ein Listenelement, das selbst ein Komma enthält, ist damit nicht darstellbar — auch nicht mit Quoting, weil die Shell-Quotes vor dem Split verschwinden.
Reproduktion
Eine Rohdatei, deren Name ein Komma enthält:
Der Pfad kommt als zwei nicht existierende Dateien an.
Warum das mehr als kosmetisch ist
raw_filesist ein Pfadfeld, und Dateinamen mit Komma sind normal. Betroffen sind ebensoentities,conceptsundrelated, sobald ein Seitentitel ein Komma trägt.tools/CONTRACT.mdschließt beimnew <type>-Fehlerfall den Ausweg explizit aus („fix the argument and retry once. Never hand-craft the page instead"), also bleibt beim heutigen Stand nur, das Argument selbst zu ändern — im Ingest vom 2026-08-30 wurde die Rohdatei umbenannt, obwohlraw/CONTRACT.mddie Rohschicht als unveränderlich führt.Lösungsvorschläge
parse_list:\,bleibt ein Literal-Komma. Minimal, rückwärtskompatibel.--setfür Array-Felder wiederholbar machen, sodass jede Wiederholung genau ein Element anhängt (--set raw_files=a --set raw_files=b). Umgeht das Trennzeichen ganz.Zusätzlich:
_check_raw_files_existsollte den Fehlertext klar als Split-Ergebnis kennzeichnen, damit die Ursache nicht erst im Quelltext gesucht werden muss.Behoben in 1.2.0 (
40adbb7).Umgesetzt wurden Vorschlag 1 und 2 — beides, weil sie verschiedene Fälle bedienen:
\,ist ein literales Komma inparse_list(commands/_util.py). Gilt damit auch fürxref add --entities.--setauf ein Arrayfeld hängt an (--set raw_files=a --set raw_files=b). Skalare Felder behalten „last one wins" — es gibt nichts zum Anhängen. Das ist die Form ohne Trennzeichen und damit die richtige, wenn ein Element ein Komma trägt._check_raw_files_existbenennt den Split als Ursache und nennt beide Auswege, ausdrücklich einschließlich „never rename the raw file to fit the flag".Ein zweiter Defekt, den erst der Test sichtbar gemacht hat
Mit Escape und Append allein war der Fall immer noch kaputt — nur eine Schicht tiefer.
dump_frontmatterschreibt Listen in Flow-Syntax ([a, b]), quotete aber nach Dokument-Kontext, wo ein Komma ein gewöhnliches Zeichen ist. In[...]ist es ein Indikator:--sethätte den Wert also korrekt geparst, und die Datei hätte ihn beim Schreiben wieder zerlegt. Gefixt infrontmatter_io.py:_round_trips_as_string(text, flow=True)prüft den Rundlauf in dem Kontext, in dem tatsächlich geschrieben wird — es fragt weiterhin den Loader, statt Regeln aufzuzählen._quote()holt das Quoting für beide Kontexte aus der Bibliothek. Ein nackter Skalar aussafe_dumpbringt sonst einen...-Dokumentende-Marker mit, der in einer Liste Unsinn ist.Bestehende Ausgabe ändert sich dadurch nicht (
tags: [k8s, ci-cd]bleibt ungequotet) — nur Werte, die vorher stillschweigend kaputtgingen.Tests
tools/wiki_tools/tests/test_util.py(neu), plus Fälle intest_new_page.pyundtest_frontmatter_io.py. Der aussagekräftigste ist der End-to-End-Fall: eine Rohdatei mit Komma im Namen wird angelegt, per\,referenziert, und die geschriebene Seite liest genau einen Pfad zurück. 658 Tests grün, auch mit leeremHOMEund ohne globale git-Config.Die Rohdatei ist zurückbenannt
5426a6e:raw/notes/Conversation Transcript - Versioning, CI-CD and Content Migration Session 2026-08-30.mdträgt wieder ihren Originalnamen.raw_files:der Source-Seite korrigiert,sources rebuild-index,sources coverage0/0,lintsauber über 255 Seiten.Eine Lücke, die dabei aufgefallen ist
Kein
wikitool-Kommando schreibtraw_files:einer bestehenden Seite.touchfasst nur die Felder an, die die Seite selbst beschreiben,xrefnur die Page-Ref-Arrays. Ich musste das Frontmatter von Hand korrigieren — Invariante 1 verbietet das fürraw_files:nicht (es steht nicht in ihrer Liste), aber es ist trotzdem der einzige Weg, und das sollte es nicht sein. Ist als eigenes Issue erfasst.