Während früher Phasen eines Projekts probieren Entwickler gerne mehrere Möglichkeiten aus, selten sind sie gut beraten, schon die ersten Ergebnisse der zentralen Versionskontrolle zu übergeben. Existiert zum Beispiel das Repository noch nicht oder steht dessen Struktur noch nicht fest, arbeiten alle praktisch ohne Sicherheitsnetz. Manches Stück guter Code fällt so schnell einem übereilten »rm *« oder einem großflächigen Delete im Editor zum Opfer.
Das Perl-Skript »noworries« kann in einer solchen Situation eine eigene automatische Versionskontrolle übernehmen. Bei jedem Sichern einer Datei im Editor und bei jeder Dateimanipulation in der Shell (wie »rm« oder »mv«) erhält ein unsichtbar im Hintergrund laufender Daemon eine Nachricht. Daraufhin schnappt er sich die erzeugte oder geänderte Datei und versioniert sie mit RCS.
Für den Benutzer läuft der Vorgang unsichtbar ab. Abbildung 1 zeigt, wie ein Benutzer zunächst in der Shell eine neue Datei erzeugt und dann löscht. Ohne Perl-Hexerei wäre das File »Datei« damit endgültig verschwunden, doch ein Aufruf von »noworries -l Datei« zeigt an, dass der Versionierer 17 Sekunden zuvor eine Sicherungskopie angelegt hat. »noworries -r 1.1 Datei« holt sie hervor und schreibt sie nach STDOUT.
Kein Trick
Das Skript benutzt keineswegs manipulierte Shellfunktionen, alles geht mit rechten Dingen zu. Allerdings läuft im Hintergrund eine Instanz des Skripts mit der Option »-w« (watch) und bespitzelt den File Alteration Monitor (FAM), der wiederum an der Dnotify-Schnittstelle des Betriebssystemkernels lauscht. Immer wenn das Dateisystem ein neues Verzeichnis oder eine Datei erzeugt, verschiebt, löscht oder deren Inhalt manipuliert, kommt eine Nachricht über den Vorfall im Kernel an. Der File Alteration Monitor dockt sich an Dnotify an und bringt sein Interesse an Ereignissen in bestimmten Dateiverzeichnissen zum Ausdruck.
Im CPAN gibt es als passendes Perl-Modul SGI::FAM, das die C-Schnittstelle nach Perl verlagert. Ein Aufruf der Methode »next_event()« blockt den Daemon dann so lange, bis ein Ereignis eingetroffen ist. CPU-intensives Pollen ist daher nicht mehr erforderlich.
Abbildung 2 zeigt ein weiteres Beispiel. Es erzeugt zunächst eine Datei, die es dann zweimal hintereinander modifiziert. Im Hintergrund hat der Daemon deswegen drei Versionen angelegt (1.1, 1.2 und 1.3). Der Aufruf »noworries -l Datei« zeigt sie anschließend an. Daran ändert sich auch nichts, wenn ein anderer Prozess die Datei zwischenzeitlich gelöscht hat.
Mit der Option »-r 1.2« wählt der Benutzer die mittlere Version aus und leitet die Ausgabe zurück in die Datei »Datei«, die der Daemon natürlich sofort erneut versioniert. Abbildung 3 zeigt dessen Aktionen, die er der Ordnung halber in der Logdatei »/tmp/noworries.log« protokolliert.Das Skript »noworries« kümmert sich um alle Dateien und Verzeichnisse in beliebiger Tiefe unter »~/noworries« im Homeverzeichnis des Benutzers. Das ist die Spielwiese, auf der er gerne neue Verzeichnisse anlegen oder Tarbälle extrahieren kann.
Parallel dazu baut der Daemon mit jeder neuen Datei eine gleichartige Verzeichnisstruktur unter »~/.noworries.rcs« auf. Jedes Unterverzeichnis darin enthält ein Verzeichnis »RCS«, in dem die versionierten Dateien lagern. RCS ist ein Unix-Urgestein, Versionskontrollsysteme wie CVS oder Perforce verwenden es noch heute.
Abbildung 1: Hier bekommt eine Datei wieder Leben eingehaucht, nachdem der Benutzer sie zuerst löschte. Retter ist der Perl-Daemon im Hintergrund.
Für das Einchecken einer Datei »datei« ist die folgende kurze Kommandosequenz zuständig:
echo "Daten!" >datei
mkdir RCS
ci datei
co -l datei
Der Befehl »ci« aus dem RCS-Fundus erzeugt eine Versionsdatei »RCS/datei,v«. Das anschließende Auschecken über »co« mit der Option »-l« (für lock) holt die letzte Version wieder zurück ins aktuelle Verzeichnis. Verändert man anschließend »datei«, gefolgt von einer weiteren »ci/co«-Kommandosequenz, liegen schon zwei Versionen vor, die »co« separat hervorholen kann. Das ebenfalls aus dem RCS-Fundus stammende Programm »rlog« erlaubt es, Meta-Informationen über die eingecheckten Dateiversionen anzusehen.
Funktionsimport
Die Namen dieser Hilfsprogramme definiert Listing 1 in den Zeilen 18 bis 20. Sie müssen allerdings im »PATH« liegen, damit »noworries« sie findet, ohne den Pfad zu kennen. Falls nötig, lassen sich die vollständigen Pfade einkodieren.
Abbildung 2: An eine neu angelegte Datei wird in zwei Einzelschritten jeweils eine Zeile angehängt. Anschließend holt »noworries« auf Anfrage wieder die ältere Version 2 hervor.
»noworries« nutzt die von Sysadm::Install exportierten Funktionen »mkd« (Verzeichnis erzeugen), »cp« (Datei kopieren), »cd« (Verzeichnis wechseln) oder »cdback« (zurück zum alten Verzeichnis) und »tap« (Programme ausführen und Ausgaben aufsammeln), die alten Snapshot-Hasen natürlich allesamt schon aus [4] bekannt sind.