Facebook
Twitter
Google+
Kommentare
0

Codingstandard konforme commits mit Mercurial

Hallo zusammen,

heute will ich mich ein bisschen über mercurial precommit hooks und wie man sie sinnvoll verwenden kann auslassen.

Zunächst sollten wir mal kurz klären was überhaupt ein Hook ist.
Ein Hook ist nichts anderes als eine Aktion die vor oder nach einem bestimmten Event ausgeführt wird, ähnlich wie ein Datenbanktrigger. Prinzipiell unterscheidet man hierbei zwischen 2 Arten von Events: Zum einen abgeschlossene Events (z.B. commit, incoming, outgoing) zum anderen kontrollierende Events (z.B. precommit, preoutgoing, pretag). Das schöne an kontrollierenden Events ist, dass sie nachfolgende Aktion abbrechen können oder einen Rollback veranlassen können, falls der Hook fehlschlägt. Und hier können wir die Überschrift wieder aufgreifen ;) wie wir alle wissen kann man, um zu überprüfen ob ein bestimmter Codingstandard eingehalten wurde, auf den PHP_CodeSniffer zurückgreifen. Jetzt wäre es doch schön wenn man beide Sachen kombinieren könnte, um zu gewährleisten dass immer nur “sauberer” Quellcode in das Repository commited werden kann.

Man hat die Möglichkeit einen Hook für ein bestimmtes Repository oder global für alle Repositories einzurichten. In meinem Beispiel wird der Hook nur für ein Repository eingerichtet.
Dazu bearbeiten wir die Datei /PFAD/ZUM/REPO/.hg/hgrc (für einen globalen Hook ist die Datei .hgrc im homeverzeichnis zu bearbeiten).

Nun legen wir eine neue Sektion [hooks] an, darunter beschreiben wir dann was unser pre commit hook machen soll.

[hooks]
precommit.phpcs = hg status -n -0 | xargs --null phpcs --standard=zend

Das wars eigentlich schon. Um zu testen ob alles korrekt funktioniert, legen wir einfach mal eine Testdatei mit folgendem Inhalt an:

<?php
   $a = 'test';

   if($a == 'test')
   {
      echo 'test';
   }
?>

Nach einem commit Versuch sollte folgendes Ergebnis erscheinen:

pew@thinkpad:/var/www/testrepo$ hg commit -m "test"

FILE: /var/www/testrepo/test.php
--------------------------------------------------------------------------------
FOUND 3 ERROR(S) AND 0 WARNING(S) AFFECTING 3 LINE(S)
--------------------------------------------------------------------------------
 4 | ERROR | Expected "if (...) {\n"; found "if(...)\n{\n"
 6 | ERROR | Spaces must be used to indent lines; tabs are not allowed
 8 | ERROR | A closing tag is not permitted at the end of a PHP file
--------------------------------------------------------------------------------

abort: precommit.phpcs hook exited with status 123

Nachdem man die Fehler ausgebessert hat, kann man wie gewohnt ins Repository committen und die interne Codequalität steigt quasi ganz automatisch ;)

Soweit zum precommit hook. Wer sich für weitere Anwendungen und Möglichkeiten von Hooks in Mercurial interessiert, dem empfehle ich das Buch Mercurial: The Definitive Guide bzw. die online verfügbare Version , im speziellen das Kapitel 10.

Schüssi und bis zum nächsten Mal.

Über den Autor

devtalk

Link erfolgreich vorgeschlagen.

Vielen Dank, dass du einen Link vorgeschlagen hast. Wir werden ihn sobald wie möglich prüfen. Schließen