Dateiformate: App-Konfiguration und .dionotes-Marker #4
Notifications
Due Date
No due date set.
Blocks
Depends on
#6 Fehlerfälle beim Anlegen und Öffnen
RDietermann/dionotes-client
#8 Selector-UI: Anlegen und Öffnen
RDietermann/dionotes-client
#3 Ablageort für die anwendungsweite Konfiguration
RDietermann/dionotes-client
Reference: RDietermann/dionotes-client#4
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?
Part of #1
Question
Welche Dateien schreibt DioNotes, wohin, in welchem Format — und was steht drin?
Es sind zwei getrennte Dinge:
1. Die anwendungsweite Konfiguration (Ort kommt aus dem Recherche-Ticket): enthält mindestens die Liste bekannter Workspaces. Zu entscheiden: Dateiformat (JSON? TOML? RON?), welche Felder pro Eintrag (Pfad, Anzeigename, zuletzt geöffnet?), Reihenfolge der Liste, und ob eine Versionsangabe mitgeschrieben wird.
2. Der
.dionotes/-Marker im Workspace-Ordner: Zu entscheiden, ob darin überhaupt eine Datei liegt oder das leere Verzeichnis als Marker reicht. Falls Datei: welche Felder (Name? Erstellungszeitpunkt? Schema-Version?) und wozu sie dienen, die noch in dieser Map gebraucht werden — nicht spekulativ befüllen.Querschnittsfrage für beide: Was passiert bei einer Datei, die nicht geparst werden kann? Und braucht es jetzt schon eine Versionsangabe, oder ist das Vorsorge für ein Problem, das noch niemand hat?
Zielgröße: für beide Dateien je ein Beispielinhalt, den man abtippen könnte.
Nachtrag nach der Recherche zum Ablageort (#3). Der Pfad ist geklärt, aber dabei ist eine dritte Entscheidung aufgetaucht, die hierher gehört:
3. Welche Crate ermittelt den Pfad? Die Recherche empfiehlt
directories 6.0.0. Zu entscheiden ist, ob die zusätzliche Abhängigkeit das wert ist:dirs 6.0.0liegt überwry/tray-iconbereits im Lockfile, kostet also nichts.directorieswar die automatische Namensnormalisierung (unter LinuxdionotesstattDioNotes) — die man auch mit einem.join("dionotes")von Hand bekommt.dirsselbst einstate_dir()? Wenn ja, schrumpft der Unterschied auf eine Zeile Code gegen eine Crate im Graph, und die Empfehlung wäre neu zu bewerten.Die Fakten zum Pfad selbst stehen in #3 und auf dem Branch
research/config-ablageort; sie sind von dieser Frage unberührt.Antwort
Format für beide Dateien: RON. Bewusst gegen
serde_json/toml, die bereits transitiv im Lockfile liegen — RON kostet eine zusätzliche Dependency, serialisiert dafür Rust-Enums undOptionohne Umwege. Das zahlt sich bei den Workspace-Einstellungen und Versionierungsoptionen aus, die noch kommen.Pfad-Ermittlung:
dirs 6.0.0, nichtdirectories.dirsliegt überwrybereits im Graph und hat sowohlstate_dir()als auchconfig_local_dir()— der einzige Mehrwert vondirectorieswäre die Kleinschreibung des Ordnernamens gewesen, und die gibt es hier durch eine Konstante.1. Die Workspace-Liste
Ort — ein Ausdruck für alle Plattformen, ohne
#[cfg]:C:\Users\<Benutzer>\AppData\Local\dionotes\workspaces.ron~/.local/state/dionotes/workspaces.ron~/Library/Application Support/dionotes/workspaces.ronWindows bekommt Local, nicht Roaming: absolute Workspace-Pfade sind maschinenspezifisch und würden beim Roaming auf einem anderen Rechner ins Leere zeigen. Linux bekommt
$XDG_STATE_HOMEstatt~/.config, weil die XDG-Spec „recently used files" wörtlich als State führt —state_dir()liefert nur dortSome, deshalb trägt der Fallback ohne Fallunterscheidung. Das Verzeichnis muss die App selbst anlegen (create_dir_all), die Basis existiert garantiert.Inhalt — eine Liste von Pfaden, sonst nichts:
path.file_name()). Ein eigenes Feld wäre nach dem ersten Umbenennen des Ordners falsch.last_opened. Die Reihenfolge der Liste ist die Sortierung; wer einen Workspace öffnet, dessen Eintrag wandert nach vorn. Spart einen Zeitstempel samt Zeitzonen- und Uhrumstellungsfragen für eine reine Sortierreihenfolge.Bei beschädigter Datei: verwerfen und mit leerer Liste starten. Kein Reparaturversuch.
2. Der
.dionotes/-MarkerEr ist kein leeres Verzeichnis, sondern enthält
.dionotes/workspace.ron. Heute steht darin genau ein Feld:schema_versionab 1. Anders als bei der Workspace-Liste ist das Wachstum des Schemas bereits angekündigt (Passwortschutz, Workspace-Einstellungen, Versionierungsoptionen). Das Feld ist der einzige Weg, eine künftig geschriebene Datei beim Einlesen als „neuer als diese App" zu erkennen, statt sie halb zu verstehen. Der billigste Zeitpunkt dafür ist jetzt, bevor Dateien in freier Wildbahn sind.created_at. Das Erstellungsdatum des Ordners kennt das Dateisystem (fs::metadata().created()). Es zu duplizieren schafft eine zweite Wahrheit, die beim Kopieren des Ordners auseinanderläuft.#[serde(default)], Felder später bruchfrei zu ergänzen — einpassword_hash: None, das noch nichts bedeutet, müsste dagegen jeder Leser interpretieren. Die Felder entstehen mit dem Feature, das sie braucht.Bei beschädigter Datei: Workspace nicht öffnen, Fehler zeigen — nicht neu anlegen. Das ist heute, mit nur
schema_versionim Marker, überstreng. Es ist die richtige Entscheidung, sobald dort ein Passwort-Hash liegt: „Datei kaputt, App legt sie ohne Hash neu an" wäre sonst ein Weg, den Schutz auszuhebeln. Diese Gewohnheit jetzt zu setzen ist billiger, als sie später umzustellen.Anschlussfrage, bewusst nicht hier entschieden
Ein Passwort-Hash in
.dionotes/sperrt den Zugang über DioNotes. Die.md-Dateien liegen unverschlüsselt daneben und sind mit jedem Editor lesbar. Soll der Schutz gegen jemanden mit Dateisystemzugriff wirken, braucht es Verschlüsselung der Notizinhalte — eigener Effort, als Fog auf der Map vermerkt.