2008-09-04 15 views
6

क्या मैं अब तकक्या पार्स त्रुटियों के लिए किसी भी php फ़ाइल को जांचने के लिए गिट प्री-प्रतिबद्ध हुक लिखने का एक बेहतर तरीका है?

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

उत्तर

1

तो प्रतिबद्ध है एक आंशिक प्रतिबद्ध (सभी नहीं काम कर पेड़ में परिवर्तन प्रतिबद्ध हैं), तो यह कर गलत परिणाम के बाद से यह काम कर रहे कॉपी और नहीं मंचन प्रतिलिपि परीक्षण दे।

एक तरह से यह करने के लिए हो सकता है:

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

कौन सा एक खरोंच अंतरिक्ष में मंचन किया छवियों की एक प्रतिलिपि बनाने और फिर वहाँ उन पर परीक्षण आदेश चला। यदि किसी भी फाइल में निर्माण में अन्य फाइलें शामिल हैं तो आपको टेस्ट ट्री में पूरी स्टेज्ड छवि को फिर से बनाना होगा और फिर बदली गई फ़ाइलों का परीक्षण करना होगा (देखें: Git pre-commit hook : changed/added files)।

3

मैं माफी चाहता हूँ अगर यह offtopic है, लेकिन आप स्वचालित परीक्षण के कुछ प्रकार (जो कि कोड नहीं सिंटैक्स त्रुटि है मतलब है) को चलाने के लिए नहीं जा सकते करने से पहले है है एक प्रतिबद्धता?

0

यदि आपको php5-cli इंस्टॉल किया गया है तो आप PHP में अपना प्री-प्रतिबद्ध लिख सकते हैं और सिंटैक्स का उपयोग अपने परिचित से कर सकते हैं।

बस कुछ और करें।

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

पूर्व-लिखें

PSR2 मानक के अनुसार 'php-CS-फिक्सर' का उपयोग या तो 'php-कोड-स्निफर' या हुक जाँच करता है कि Git में संशोधित फ़ाइलों 'त्रुटि मुक्त' कर रहे हैं और कर रहे हैं मेरे पीएचपी कार्यान्वयन
#!/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); 
     }