2008-09-04 8 views
6

Was ich bisher istGibt es eine bessere Möglichkeit, einen Git-Pre-Commit-Hook zu schreiben, um eine PHP-Datei in einem Commit für Parse-Fehler zu überprüfen?

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

Antwort

1

Wenn der Commit einen Teil begehen (nicht alle Veränderungen in dem Arbeits Baum sind verpflichtet), dann ist diese Make falsche Ergebnisse liefern, da sie die Arbeitskopie und nicht die inszenierte Kopie prüfen.

Eine Möglichkeit, dies könnte 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 

, die eine Kopie der inszenierten Bilder in einen Scratch-Platz machen würde und dann auf sie dort den Test-Befehl ausführen. Wenn eine der Dateien andere Dateien im Build enthält, müssen Sie möglicherweise das gesamte gestufte Bild in der Teststruktur neu erstellen und dann die geänderten Dateien dort testen (siehe: Git pre-commit hook : changed/added files).

3

Es tut mir leid, wenn es offtopic ist, sind aber nicht Sie soll eine Art von automatisierten Tests auszuführen (was bedeuten würde, dass der Code keine Syntaxfehler hat), bevor Sie ein Commit?

0

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

Tun Sie einfach etwas mehr wie.

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

Meine PHP Implementierung der pre-commit Haken überprüft, ob die geänderten Dateien in git sind 'fehlerfrei' und sind nach PSR2 Standard entweder 'php-code-Sniffer' oder 'php-cs-Fixierer'

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