2010-09-15 14 views
7

एक गिट भंडार के लिए एक PHP वाक्यविन्यास जांच हुक बनाने की कोशिश कर रहा है। मैं खुश था जब मुझे एक कोड स्निपेट मिला जो वास्तव में करता है।गिट हुक वाक्यविन्यास चेक

लेकिन ऐसा लगता है कि स्निपेट स्क्रिप्ट में कोई दोष है। यह सूचकांक में फ़ाइलों की एक सूची प्राप्त करने के लिए

git diff-index --cached --name-only HEAD 

निष्पादित करता है। अब यह उस सूची में प्रत्येक फ़ाइल के लिए php -l चलाता है। दोष यह है कि एक कार्यशील प्रतिलिपि और स्टेजिंग क्षेत्र के बीच एक फ़ाइल भिन्न हो सकती है। यदि स्टेजिंग एरिया php में सिंटैक्स त्रुटि है, लेकिन वर्किंग कॉपी संस्करण नहीं है, कोई वाक्यविन्यास त्रुटि नहीं मिली है और कमिट सफल होता है जो रोकने के लिए चीज था।

क्या यह हल करने के लिए एक अनौपचारिक समस्या है, या प्रत्येक फ़ाइल के स्टेजिंग संस्करण पर php -l चलाने का कोई तरीका है?

उत्तर

7

मैं इस php syntax validation hook का उपयोग करके बहुत खुश हूं। उम्मीद है कि यह आपकी जरूरतों को भी फिट करेगा।

यह git diff-index --cached --full-index का उपयोग करता है। हुक सभी अमान्य php वाक्य रचना और गलत कोडिंग मानक के साथ करता है मना करने के लिए सर्वर साइड पर स्थापित-प्राप्त पूर्व एक टीम में काम करने के लिए आप का उपयोग करना चाहिए

+0

+1 एक काम करने वाले हुक के लिए +1। – VonC

+0

हां, यह लेख से हुक से बेहतर है। – zedoo

+0

हुक बहुत अच्छा है, हालांकि इसमें थोड़ा बदलाव की आवश्यकता है ताकि मैं इसका उपयोग कर सकूं। मुझे 'कट' कमांड – cwhsu

2

मुझे यकीन नहीं है कि यहां कोई समस्या है या नहीं।

आपके द्वारा उल्लेखित स्निपेट शायद ब्लॉग पोस्ट Don’t Commit That Error से आता है।
और यह शामिल हैं:

इसके बाद, हम कुछ मानकों के साथ git diff-index कहते हैं।
पहला, हम गिट को बताने के लिए --cached जोड़ते हैं, हम केवल उन फ़ाइलों को चाहते हैं जो किए जा रहे हैं।
फिर, हम गिट को केवल फाइलों के नाम को आउटपुट करने के लिए --name-only जोड़ते हैं।

ऐसा लगता है कि जिन फाइलों को करने के बारे में हैं, वे ठीक से पूर्व-प्रतिबद्ध हुक का निरीक्षण करना चाहते हैं।
भले ही वे कार्यशील निर्देशिका में फ़ाइलों से भिन्न हों, फिर भी यह उनका संस्करण (अनुक्रमणिका में) है जो प्रतिबद्ध होना है। और यह वही संस्करण है जो php -l प्रक्रिया को भेजा जाएगा।


दरअसल, समस्या git diff-index ही (के साथ या --full-index के बिना) में नहीं है जिस तरह से आप सूचकांक

  • "PHP Advent 2008" hook बस करने की कोशिश करेंगे में फ़ाइल की सामग्री पढ़ा जाएगा में है
 
exec("php -l " . escapeshellarg($file), $lint_output, $return); 
(काम कर प्रति तक पहुँचने के जोखिम के साथ) अपने नाम से फ़ाइल का उपयोग
  • "phpbb3" hook (his answer में takeshkin ने उल्लेख किया) वास्तविक सामग्री के लिए Git पूछेगा:
 
result=$(git cat-file -p $sha | /usr/bin/env $PHP_BIN -l 2>/dev/null) 

कुंजी का उपयोग करना git cat-file है यहाँ, Git रेपो में एक वस्तु का उपयोग करने की (अर्थात "काम करने वाली निर्देशिका" में नहीं)

+0

हां, यह कोड के बारे में मैं बात कर रहा हूँ है। $ आउटपुट में आपको उन फ़ाइलों की सूची मिलती है जो प्रतिबद्ध हैं, सही हैं। लेकिन मुझे लगता है कि आप अपनी आखिरी वाक्य में गलत हैं। यह कामकाजी प्रतिलिपि संस्करण है जो php -l को भेजा जाता है, स्टेजिंग क्षेत्र संस्करण नहीं। और यह एक त्रुटि है। Takeshin द्वारा जुड़ा हुआ हुक बेहतर लगता है। – zedoo

+0

@zedoo: मैंने यहां वास्तविक मुद्दे पर प्रतिबिंबित करने के लिए अपना उत्तर अपडेट किया है (जो 'गिट diff-index' नहीं है) – VonC

+0

हां, बिल्कुल। +1;) – zedoo

0

कारण पूर्व प्रतिबद्ध हुक अच्छा नहीं है।

मेरे द्वारा बनाए गए कि pupose के लिए अजगर स्क्रिप्ट पूर्व प्राप्त करते हैं:

# A server-side git hook script for checking PHP syntax and validating coding standard 
# Depends on: PHP_CodeSniffer (http://pear.php.net/package/PHP_CodeSniffer/) 
# Install: copy this script to <server side repo location>/hooks/pre-receive 
#!/usr/bin/python 

import os 
import sys 
oldrev, newrev, ref = sys.stdin.read().strip().split(' ') 
test_file = os.popen('mktemp').read().strip() 
coding_standards = 'PSR2' 
for line in os.popen('git diff --name-only %s %s' % (oldrev, newrev)).readlines(): 
    extension = line.split('.')[-1].strip() 
    file_name = line.strip() 

    if(extension == 'php'): 
     os.system("git cat-file -p %s:%s > %s" % (newrev, file_name, test_file)) 
     if 0 != os.system('php -l ' + test_file + ' > /dev/null'): 
      print "PHP Syntax error in file %s" % (file_name) 
      sys.exit(1) 

     if 0 != os.system("phpcs -n --standard=%s %s" % (coding_standards, test_file)): 
      print "Coding standards fail in file %s" % (file_name) 
      sys.exit(2) 
+2

के कारण सही फ़ाइल नाम और एक्सटेंशन नहीं मिल रहा है लिंक टूटा हुआ है :-( –

संबंधित मुद्दे