2008-09-04 22 views
6

Ce que j'ai à ce jour estY at-il une meilleure façon d'écrire un git pre-commit crochet pour vérifier un fichier php dans un commettras pour les erreurs parse?

#!/bin/sh 

php_syntax_check() 
{ 
    retval=0 
    for i in $(git-diff-index --name-only --cached HEAD -- | grep -e '\.php$'); do 
     if [ -f $i ]; then 
      output=$(php -l $i) 
      retval=$? 
      if [ $retval -gt 0 ]; then 
       echo "==============================================================================" 
       echo "Unstaging $i for the commit due to the follow parse errors" 
       echo "$output" 
       git reset -q HEAD $i 
      fi 
     fi 
    done 

    if [ $retval -gt 0 ]; then 
     exit $retval 
    fi 
} 
php_syntax_check 

Répondre

1

Si la validation est une validation partielle (pas tous les changements dans l'arbre de travail se sont engagés), cette marque donnent des résultats incorrects car il teste la copie de travail et non la copie mise en scène.

Une façon de faire cela pourrait être:

git diff --cached --name-only --diff-filter=ACMR | xargs git checkout-index --prefix=$TMPDIR/ -- 
find $TMPDIR -name '*.php' -print | xargs -n 1 php -l 

Ce qui ferait une copie des images mises en scène dans un espace de travail, puis exécutez la commande test sur eux là-bas. Si l'un des fichiers comprennent d'autres fichiers dans la construction, alors vous pouvez recréer l'ensemble mis en scène l'image dans l'arborescence de test, puis tester les fichiers modifiés il (Voir: Git pre-commit hook : changed/added files).

3

Je suis désolé si c'est offtopic, mais ne sont pas vous censé exécuter une sorte de tests automatisés (qui impliquerait que le code n'a pas d'erreurs de syntaxe) avant de faire un commit?

0

Si vous avez les php5-cli installé, vous pouvez écrire votre pré-livraison en PHP et utiliser la syntaxe votre plus familier.

Il suffit de faire quelque chose comme.

#!/usr/bin/php 
<?php /* Your pre-commit check. */ ?> 
0

Mon implémentation PHP des contrôles crochet pré-COMMIT si les fichiers modifiés dans git sont « sans erreur » et sont selon la norme RPS2 utilisant PHP-code sniffer »ou « php-cs-fixeur »

#!/usr/local/bin/php 
<?php 
    /** 
     * Collect all files which have been added, copied or 
     * modified and store them in an array - output 
     */ 
     exec('git diff --cached --name-only --diff-filter=ACM', $output); 

     $isViolated = 0; 
     $violatedFiles = array(); 
     // $php_cs_path = "/usr/local/bin/php-cs-fixer"; 
     $php_cs_path = "~/.composer/vendor/bin/phpcs"; 

     foreach ($output as $fileName) { 
      // Consider only PHP file for processing 
      if (pathinfo($fileName, PATHINFO_EXTENSION) == "php") { 
       $psr_output = array(); 

       // Put the changes to be made in $psr_output, if not as per PSR2 standard 

       // php-cs-fixer 
       // exec("{$php_cs_path} fix {$fileName} [email protected] --dry-run --diff", $psr_output, $return); 

       // php-code-sniffer 
       exec("{$php_cs_path} --standard=PSR2 --colors -n {$fileName}", $psr_output, $return); 

       if ($return != 0) { 
        $isViolated = 1; 
        $violatedFiles[] = $fileName; 
        echo implode("\n", $psr_output), "\n"; 
       } 
      } 
     } 
     if ($isViolated == 1) { 
      echo "\n---------------------------- IMPORTANT --------------------------------\n"; 
      echo "\nPlease use the suggestions above to fix the code in the following file: \n"; 
      echo " => " . implode("\n => ", $violatedFiles); 
      echo "\n-----------------------------------------------------------------------\n\n\n"; 
      exit(1); 
     } else { 
      echo "\n => Committed Successfully :-)\n\n"; 
      exit(0); 
     }