Esiste un modo migliore per scrivere un hook pre-commit git per controllare eventuali errori di analisi di qualsiasi file php in un commit?

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

  •  09-06-2019
  •  | 
  •  

Domanda

Quello che ho finora è

#!/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
È stato utile?

Soluzione

Se il commit è un commit parziale (non tutte le modifiche nell'albero di lavoro vengono confermate), allora questo darà risultati errati poiché testa la copia di lavoro e non la copia in stage.

Un modo per farlo potrebbe essere:

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

Ciò creerebbe una copia delle immagini allestite in uno spazio di lavoro e quindi eseguirebbe lì il comando test su di esse.Se uno qualsiasi dei file include altri file nella build, potrebbe essere necessario ricreare l'intera immagine preparata nell'albero di test e quindi testare lì i file modificati (vedere: Hook pre-commit Git:file modificati/aggiunti).

Altri suggerimenti

Mi dispiace se è fuori tema, ma non dovresti eseguire una sorta di test automatizzati (il che implicherebbe che il codice non abbia errori di sintassi) prima di eseguire un commit?

Se hai installato php5-cli puoi scrivere il tuo pre-commit in PHP e utilizzare la sintassi con cui hai più familiarità.

Fai semplicemente qualcosa di più simile.

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

La mia implementazione PHP dell'hook pre-commit controlla se i file modificati in git sono "privi di errori" e sono conformi allo standard PSR2 utilizzando "php-code-sniffer" o "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);
        }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top