git - यदि प्रारूपण परिवर्तन आवश्यक हैं तो क्या क्लैंग-प्रारूप मुझे बता सकता है




clang-format (4)

जिन कारणों से मुझे ऐसा लगता है, उनमें से एक यह आसान होना चाहिए क्योंकि यह -output-प्रतिस्थापन-एक्सएमएल अनिवार्य रूप से मुझे वह उत्तर देता है जो मैं चाहता हूं, यह सिर्फ मुझे एक आसान तरीके से उपभोग करने के लिए नहीं देता है। हालांकि, आउटपुट के बाद से यदि कोई प्रतिस्थापन की आवश्यकता नहीं है, तो बहुत ही अनुमानित है, आउटपुट को पार्स करना बहुत कठिन नहीं है।

मेरे पास अभी जो है वह है

clang-format -style=file -output-replacements-xml | grep -c "<replacement " >/dev/null

यह वास्तव में मुझे बाहर निकलने के कोड का उलटा देता है, क्योंकि grep 0 रिटर्न करता है यदि कुछ मेल खाता है, 1 यदि कुछ नहीं करता है। लेकिन इससे निपटना काफी आसान है।

तो मेरे बिट पूर्व कमिट हुक के प्रासंगिक बिट होगा

git diff --cached --name-only --diff-filter=ACMRT |
  grep "\.[cmh]$" |
  xargs -n1 clang-format -style=file -output-replacements-xml |
  grep "<replacement " >/dev/null
if [ $? -ne 1 ]; then 
    echo "Commit did not match clang-format"
    exit 1
fi
  1. अनुक्रमणिका में फ़ाइलों का पूरा फ़ाइल नाम प्राप्त करें (उन फ़ाइलों को छोड़कर, जिन्हें हटाया जा रहा है और अन्य असामान्य मामले जहां मैं फ़ाइल को संसाधित नहीं करना चाहूंगा)
  2. केवल उन चीजों के फ़ाइलनाम रखें जिन्हें मैं (मेरे मामले में केवल c, m, और h फ़ाइलें) के स्वरूपण की जाँच करना चाहता हूँ
  3. Xargs के माध्यम से परिणामों को अनिवार्य रूप से "प्रत्येक" अगले कमांड के लिए चलाएं
  4. सभी फ़ाइलों पर -output- प्रतिस्थापन-xml विकल्प के साथ क्लैंग-प्रारूप चलाएँ
  5. प्रतिस्थापन के लिए खोजें (प्रतिस्थापन के विपरीत) जो इंगित करता है कि क्लैंग-प्रारूप ने एक प्रतिस्थापन पाया है जिसे वह बनाना चाहता है। (XML के रूप में सभी उत्पादन को खारिज करना उपयोगकर्ता के लिए सार्थक नहीं होगा।)
  6. अंतिम आदेश 1 से बाहर निकलता है (grep कहता है कि हमें कुछ नहीं मिला) हम कर रहे हैं और चीजें ठीक हैं।
  7. यदि नहीं, तो एक संदेश प्रदर्शित करें और 1 से बाहर निकलें, जो प्रतिबद्ध को रद्द करता है। दुर्भाग्य से हमारे पास उपयोगकर्ता को यह बताने का आसान तरीका नहीं है कि कौन सी फ़ाइल समस्या थी, लेकिन वे स्वयं क्लैंग-प्रारूप चला सकते हैं और देख सकते हैं।

क्या कोई ऐसा तरीका है जिससे आप clang-format को एक मोड में चला सकते हैं जहां यह रिपोर्ट करता है कि क्या फाइल निर्दिष्ट फॉर्मेट से मिलती है? एक प्रकार का ड्राई-रन मोड जहां यह रिपोर्ट करता है कि क्या परिवर्तन की आवश्यकता है, लेकिन यह परिवर्तन नहीं करता है। यदि फाइल में बदलाव की जरूरत है तो आदर्श रूप से मैं एक गैर-शून्य निकास कोड को वापस करने के लिए क्लैंग-प्रारूप चाहूंगा। या, और भी अधिक आदर्श रूप से, एक गैर-शून्य निकास कोड और मानक आउटपुट पर परिवर्तन की आवश्यकता वाली फ़ाइलों की एक सूची।

मैं प्रश्न को सामान्य रखने की कोशिश कर रहा हूं, ताकि अधिक लोग जवाब दे सकें, लेकिन मैं जो करने की कोशिश कर रहा हूं, वह एक प्री-कमिट हुक लिख रहा है, जो किसी भी ऐसे कमिट को अस्वीकार कर देगा जो अपेक्षित .clang- प्रारूप से मेल नहीं खाता है। सूचकांक में फ़ाइलों की सूची पर क्लैंग-प्रारूप को चलाना आसान है। लेकिन यह जानना मुश्किल है कि वास्तव में क्लैंग-प्रारूप ने कुछ भी बदल दिया है।

मेरे पास एक संभावित समाधान है, जो ऑन -output-replacements-xml पर आधारित है (कि मैं एक उत्तर के रूप में पोस्ट करूंगा), लेकिन यह एक हैक है और मुझे ऐसा लगता है कि यह अधिक सीधा होना चाहिए। टिप्पणियाँ / सुझाव, संपादन, विभिन्न उत्तर / दृष्टिकोण सभी का स्वागत है।


मुझे पूरा यकीन नहीं है कि आपका उपयोग मामला क्या है, लेकिन git-clang-format ( https://llvm.org/svn/llvm-project/cfe/trunk/tools/clang-format/git-clang-format ) देखें । यह मूल रूप से गिट के लिए एक क्लैंग-प्रारूप एकीकरण प्रदान करता है और शायद यही वह है जो आप खोज रहे हैं।


मैंने इस पोस्ट में phs से टिप्पणी को थोड़ा समायोजित किया:

find embedded/ -regex '.*\.\(ino\|cpp\|hpp\|cc\|cxx\|h\)' -exec cat {} \; | diff -u <(find embedded/ -regex '.*\.\(ino\|cpp\|hpp\|cc\|cxx\|h\)' -exec clang-format-3.9 -style=file {} \;) -

अर्थात्..

  1. सभी cpp-ish फ़ाइलों और पाइप को cat जो अलग करने के लिए है ( diff स्वीकार करेगा क्योंकि मैं निर्दिष्ट करता हूं - अंत में)
  2. उन्हीं फाइलों पर clang-format चलाने के लिए प्रोसेस प्रतिस्थापन ( <( .. ) सिंटैक्स) का उपयोग करें। यहां इन-फॉर्मेटिंग का उपयोग न करें। यह दूसरा आधा हिस्सा है जिसे अलग करने के लिए भेजा गया है
  3. अगर कोई उत्पादन, सफलता के साथ अलग बाहर निकलता है! आप $? के माध्यम से निकास कोड भी देख सकते हैं $? - यह शून्य होना चाहिए।

मेरे पास मेरी सीआई सेवा (ट्रैविस) है जो इस बात को सुनिश्चित करने के लिए कि उन्हें ठीक से स्वरूपित करने के लिए एक बैश स्क्रिप्ट में इस लाइन को चलाया जाए। मेरे पास असल में फॉर्मेटर चलाने के लिए एक और स्क्रिप्ट है। यह मुझे एक चेतावनी याद दिलाता है: आपको एक शेल का उपयोग करना चाहिए जो प्रक्रिया उप कर सकता है ( पॉज़िक्स शेल नहीं करता है )।


run-clang-format एक साधारण आवरण है, जिसे clang-format चारों ओर एक हुक के रूप में या निरंतर एकीकरण स्क्रिप्ट के रूप में उपयोग करने के लिए डिज़ाइन किया गया है।

मुख पृष्ठ पर दिया गया उदाहरण स्वयं बोलता है:






clang-format