16 August 2008

Auto-props für PHP-Scripte

...um den Überblick über verschiedene Bearbeitungszustände seiner Dateien zu behalten, bietet sich (wie der Name schon verspricht) eine Versionsverwaltung an. Um nun - schaut man dann in die Dateien rein - eine schnelle Info zu bekommen, mit welcher Datei man es eigentlich zu tun hat und (möglicherweise auch wichtig), wer die Datei bearbeitet hat, lohnt es sich, diese Informationen gleich mit in der Datei zu speichern. Hierbei kann es schnell nerven, dies manuell machen zu müssen.
Für selbst recht kleine Scriptbasteleien in PHP stellte sich für mich heraus, daß diese 'Minimalversionskontrolle' aufwendig, fehleranfällig und dadurch total unbrauchbar ist.
Um das Schreiben von Informationen zu einer Datei (z.B. in den Kommentarheader) zu automatisieren, bietet Subversion Schlüsselwörter an, die in den Dateien z.B. bei einem commit durch den Namen des Autors, das Änderungsdatum oder die Versionsnummer ersetzt werden.
Erstellt man in PHP die Kommentarblöcke automatisch, lohnt es sich, gleich den entsprechenden Schlüssel mit eintragen zu lassen. Um die Kommentarblöcke zu erstellen nutze ich den DocBlockGenerator aus pear und, da ich Subversion nutze, lasse ich diesen über den Parameter version gleich den passenden Schlüssel eintragen ('version'=>'svn' im Parameterarray oder -v svn für docblockgen über die Kommandozeile).
Schaut man sich den Kommentarheader der Datei an, sieht man dort die Zeile
* @version SVN: $Id:$
mit dem Schlüssel $Id:$ für SVN.
An einem kleinen Beispiel möchte ich nun zeigen, daß Subversion dann auch das macht, was es soll:
Nehmen wir an, wir haben in /var/www/foo ein PHP-Script foo.php mit automatisch erzeugten Kommentarblöcken, möchten diese in ein Repository einpflegen und dabei soll Subversion den Schlüssel $Id:$ ersetzen.
Zuerst müssen wir Subversion so konfigurieren, daß es die Ersetzung auch durchführt. Auf Benutzerebene ändern wir hierzu die Konfigurationsdatei ~/.subversion/config, stellen darin unter [miscellany] enable-auto-props = yes und erstellen dann unter [auto-props] einen Eintrag, damit Subversion die Ersetzungen für PHP-Scripte vornimmt:
*.php = svn:eol-style=native;svn:keywords=Author Id Revision Date
(Für Dateien mit anderen Endungen (z.B. .tpl o.ä.) entsprechende Einträge)
Nun legen wir (z.B. im Homeverzeichnis) ein Repository für unser foo-Projekt an
svnadmin create $HOME/svn/foo
und pflegen unsere Daten ein
svn import /var/www/foo file://$HOME/svn/foo/trunk -m 'erster Import'
Als Client für SVN benutze ich RapidSVN. Hier kann man sich nun ein Bookmark auf das Repository erstellen und dies dann als 'New Working Copy' irgendwohin auschecken (siehe Bild).
Ein Blick in die Datei /trunk/foo.php unserer Arbeitskopie zeigt nun, daß Subversion tatsächlich den Schlüssel ersetzt hat. Im Kommentarheader steht nun eine ähnliche Zeile wie
* @version SVN: $Id: foo.php 1 2008-12-24 11:55:00Z bearbeiter $
Erstellt man aus den Kommentarblöcken mit z.B. dem phpDocumentor eine Dokumentation, hat man nun (natürlich) zu jeder Datei unter dem Punkt 'version' das entsprechende Bearbeitungsdatum, die Version und den Autor auf einen Blick.

Ach, und, um das nicht zu vergessen: Happy Birthday Debian!

(Bild: Screenshot RapidSVN mit foo als Repo und Arbeitskopie)

Labels: ,