Ordner ohne git: Unter Linux bekommt jede Karte wieder ihre Änderungen

Zwei Karten arbeiten gleichzeitig im Ordner Documents, dazwischen ändert der Owner selbst Notes.md. Derselbe Ablauf lief in einem Linux-Container (Kernel 6.12), einmal mit dem Stand von 0.6.0, einmal mit der Korrektur.

Was jede Karte als ihre Änderungen listet

Vorher (0.6.0)

„Sort the scans“
(nichts geändert)
„Answer the court“

Verschiebung und Edit fehlen: Sie gehören keiner Karte, und „Verwerfen“ würde sie nicht zurücknehmen.

Nachher

„Sort the scans“
„Answer the court“

Die Änderung des Owners an Notes.md steht bei keiner Karte, wie es sein soll.

Die Ursache

Obeya ordnet eine Änderung über ihre ctime (den Zeitstempel, den nur das Dateisystem setzt) dem Werkzeugaufruf zu, der gerade lief. Der Beginn des Aufrufs kam aus der Systemuhr. Linux stempelt die ctime aber mit einer groben Uhr, die bis zu einem Takt (1 bis 10 ms) nachgeht. Im Container lag die ctime einer eben geschriebenen Datei in 1955 von 2000 Fällen vor der Systemzeit, die unmittelbar vor dem Schreiben gelesen wurde, um bis zu 1,7 ms. Eine Änderung direkt nach Beginn des Aufrufs schien so vor ihm passiert zu sein. Auf dem Mac geht die Uhr nicht nach, deshalb waren die Tests dort grün.

Jetzt liest Obeya den Beginn an der Uhr des Dateisystems ab: Es schreibt beim Start eines Aufrufs eine eigene kleine Datei unter ~/.obeya und nimmt deren ctime. Im Ordner des Owners schreibt es dafür nichts.

Tests

VorherNachher
„Ordner ohne git“ (14 Tests), GitHub Actions (Tag v0.6.0) bzw. Linux-Container10 scheiternalle grün, 15 Läufe hintereinander
Ganze Suite auf macOSgrün1240 grün, 0 scheitern

Einer der zehn Tests war selbst falsch: Er erwartete, dass Dateien, die ein Rückgängigmachen ohne Klon nicht wiederherstellen kann, aus der Liste der Karte verschwinden. Laut Design bleiben sie drin. Der Zweig lief nur dort, wo das Dateisystem nicht klont, also nie auf dem Mac. Der Test erwartet jetzt, was das Design sagt.

Im Container scheitern noch Tests, die Chrome, unzip oder sqlite3 brauchen. Die fehlen nur dort; der GitHub-Runner hat sie, und dort scheiterten nur die zehn Ordner-Tests. Den Lauf auf GitHub selbst gibt es erst, wenn der Commit auf main ist.