9 Stimmen

Gibt es eine bessere Möglichkeit, einen Git Pre-Commit-Hook zu schreiben, um jede PHP-Datei in einem Commit auf Parse-Fehler zu überprüfen?

Was ich bisher habe, ist

#!/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

2voto

Anonymous Punkte 267

Es tut mir leid, wenn es offtopic ist, aber sollten Sie nicht eine Art von automatisierten Tests durchführen (was bedeuten würde, dass der Code keine Syntaxfehler hat), bevor Sie eine Übergabe machen?

2voto

LarryH Punkte 1443

Wenn der Commit ein partieller Commit ist (nicht alle Änderungen im Arbeitsbaum werden committed), dann führt dies zu falschen Ergebnissen, da die Arbeitskopie und nicht die Staged Copy getestet wird.

Eine Möglichkeit wäre, dies zu tun:

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

Dadurch würde eine Kopie der bereitgestellten Bilder in einem Scratch-Speicher erstellt und der Testbefehl dort ausgeführt. Wenn eine der Dateien andere Dateien im Build enthält, müssen Sie möglicherweise das gesamte Staged Image im Testbaum neu erstellen und dann die geänderten Dateien dort testen (siehe: Git pre-commit hook : geänderte/hinzugefügte Dateien ).

0voto

Wenn Sie den php5-cli installiert haben, können Sie Ihren Pre-Commit in PHP schreiben und die Syntax verwenden, mit der Sie besser vertraut sind.

Mach einfach etwas mehr wie.

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

0voto

Sudheesh.M.S Punkte 477

Meine PHP-Implementierung des Pre-Commit-Hooks prüft, ob die geänderten Dateien in Git 'fehlerfrei' sind und dem PSR2-Standard entsprechen, indem ich entweder 'php-code-sniffer' oder 'php-cs-fixer' verwende

#!/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);
        }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X