Laat Git je code controleren met een pre-commit hook

Of je nu alleen of in team werkt, het schrijven van cleane code is een must voor elke developer. Maar iedereen die wel eens een stukje code geprogrammeerd heeft, weet dat dat niet altijd eenvoudig is. Gelukkig zijn er enkele handige trucjes om je te helpen coding standards actief toe te passen.

 

Hulpmiddeltjes

 

Een eerste stap die je kan maken is het correct instellen van je IDE voor de programmeertaal en het framework dat je gebruikt. In de meeste IDE’s kan je je code automatisch laten formatteren met een eenvoudige toetsencombinatie. PHPStorm kan je bijvoorbeeld heel makkelijk instellen voor Drupal development.

 

code_style_drupal.png

 

Wanneer je gebruik maakt van een versiebeheersysteem is er ook een tweede hulpmiddel voorhanden: het schrijven van hooks. Zowel Git als Subversion kennen deze functionaliteit, maar wij gaan in dit artikel verder in op Git (hoewel ongeveer dezelfde methode toepasbaar is voor SVN).

 

git_hooks_directory.png

 

Binnen een Git repository kan je een aantal hooks of brokken code definiëren die automatisch getriggerd worden bij bepaalde events. Een lijstje van alle beschikbare hooks vind je hier.

Eentje daarvan is heel erg handig: de pre-commit hook. Deze laat ons toe om alle gewijzigde files die je wil committen te inspecteren op fouten tegen de coding conventies. Wanneer er fouten gedetecteerd worden, wordt de commit afgebroken en ben je gedwongen om je code correct op te maken.

 

Implementeren van een pre-commit hook

 

Elke repository op je machine heeft een verborgen .git/hooks folder met daarin voorbeeldbestanden voor alle mogelijke hooks. Om een eigen hook te definiëren hoef je enkel een bestandje in deze map aan te maken met de naam van de hook (of de .sample extensie van het voorbeeldbestand te verwijderen) en ervoor te zorgen dat het bestand uitvoerbaar is vanaf de command line.

Dit heeft een leuk voordeel: je kan kiezen in welke taal je de hook schrijft, zolang deze uitvoerbaar is vanaf je terminal. Wanneer je even googlet op pre-commit hooks kom je al heel wat kant-en-klare voorbeelden tegen die je zo kan gebruiken.

 

Een pre-commit hook voor Drupal

 

Zelf schreef ik een tijdje terug een hook voor een Drupal project waar ik aan werkte.

Al snel merkte ik hoe vervuild mijn commits waren met overgebleven debugcode, cryptische commentaren, foute formattering en meer van dat. Na de hook een tijdje te gebruiken, ging ik bewuster denken aan de coding conventies tijdens het programmeren. Ik had ondertussen immers geleerd dat ik anders achteraf alles mocht opruimen.

Aangezien het een grote hulp is besloot ik mijn implementatie van de pre-commit hook publiek te maken. Hoewel het nog een work in progress is kan je de hook downloaden via Bitbucket

 

Werking hook Drupal

 

De hook bestaat uit een eenvoudige klasse waarin een aantal methodes gedefinieerd zijn die verschillende controles uitvoeren. Je kan eenvoudig deze controlemethodes in commentaar plaatsen of toevoegen naar je eigen smaak.

 

methodes.png

 

Wanneer de pre-commit hook in werking treedt, wordt er aan de hand van een git diff commando nagekeken welke bestanden gewijzigd zijn:

 

git_diff.png

 

In de volgende stap wordt per bestand geëvalueerd of het in aanmerking komt voor validatie. Bestanden van Drupal core, contributed modules en gegenereerde bestanden van de features module worden overgeslagen.

 

folder_check.png

 

De bestanden die overblijven worden iteratief gecontroleerd via een aantal methodes. Hierin kan je makkelijk zelf aanpassingen maken om de validatie strenger of flexibeler te maken.

De belangrijkste controle gebeurt in de testPhpcs() methode. Hier wordt gebruik gemaakt van het PHP CodeSniffer script om code te controleren tegen de Drupal coding standards.

 

phpcs.png

 

Het script is eenvoudig te installeren én PHPStorm biedt er ondersteuning voor. Installatie-instructies vind je op de Github repo, drupal.org en op de JetBrains helppagina’s.

Als laatste stap wordt alle feedback van de tests verzameld en uitgeprint in je terminal. Zo krijg je per bestand een overzicht van de gevonden fouten.

 

output.png

output_2.png

 

Wanneer er geen fouten gevonden worden, krijg je een succesboodschap te zien en wordt de commit uitgevoerd:

 

output_3.png

 

Wil je toch bestanden committen met validatiefouten, dan kan je de –no-verify optie gebruiken bij het git commit commando.

 

Een stapje verder

 

Leuk en aardig allemaal, maar bij een grote commit waarin veel fouten gedetecteerd worden heb je nog steeds veel werk om alles te verbeteren.

Gelukkig bestaat hier ook een tooltje voor: de PHP Code Beautifier and Fixer. Dit is een tweede script dat bij PHP CodeSniffer hoort. Wanneer je het phpcs commando vervangt door phpcbf, worden heel wat gedetecteerde fouten automatisch opgelost. Het mooie hieraan? Het is compatibel met Drupal.

Hoe je phpcbf gebruikt lees je hier en hier.

 

Je hook beschikbaar maken voor elke repo

 

Indien je regelmatig in een ander project werkt is het niet zo handig om voor elk project de pre-commit file opnieuw te kopiëren naar de .git/hooks folder van dat project. Om dit te voorkomen kan je je hooks globaal definiëren. Zo kan je dezelfde hook voor alle projecten op je machine gebruiken.

 

Wil je hier graag meer over ontdekken? Contacteer ons gerust voor een vrijblijvende babbel! 

Meer weten? Contacteer ons!