Existe-t-il une meilleure façon d'écrire un hook de pré-commit git pour vérifier les erreurs d'analyse d'un fichier php dans un commit ?

StackOverflow https://stackoverflow.com/questions/43374

  •  09-06-2019
  •  | 
  •  

Question

Ce que j'ai jusqu'à présent, c'est

#!/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
Était-ce utile?

La solution

Si la validation est une validation partielle (toutes les modifications dans l'arborescence de travail ne sont pas validées), alors cette validation donne des résultats incorrects puisqu'elle teste la copie de travail et non la copie intermédiaire.

Une façon de procéder 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 préparées dans un espace de travail, puis y exécuterait la commande de test.Si l'un des fichiers inclut d'autres fichiers dans la construction, vous devrez peut-être recréer l'intégralité de l'image intermédiaire dans l'arborescence de test, puis y tester les fichiers modifiés (voir : Hook de pré-commit Git :fichiers modifiés/ajoutés).

Autres conseils

Je suis désolé si c'est hors sujet, mais n'êtes-vous pas censé exécuter une sorte de tests automatisés (ce qui impliquerait que le code ne contient aucune erreur de syntaxe) avant de procéder à une validation ?

Si vous avez installé php5-cli, vous pouvez écrire votre pré-commit en PHP et utiliser la syntaxe que vous connaissez mieux.

Faites simplement quelque chose de plus semblable à.

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

Mon implémentation PHP du hook de pré-commit vérifie si les fichiers modifiés dans git sont « sans erreur » et sont conformes à la norme PSR2 en utilisant soit « php-code-sniffer » ou « php-cs-fixer ».

#!/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} --rules=@PSR2 --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);
        }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top