هل هناك طريقة أفضل لكتابة ربط git pre-commit للتحقق من أي ملف php في الالتزام بحثًا عن أخطاء التحليل؟

StackOverflow https://stackoverflow.com/questions/43374

  •  09-06-2019
  •  | 
  •  

سؤال

ما لدي حتى الآن هو

#!/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
هل كانت مفيدة؟

المحلول

إذا كان الالتزام التزامًا جزئيًا (لم يتم الالتزام بجميع التغييرات في شجرة العمل)، فإن هذا يعطي نتائج غير صحيحة لأنه يختبر نسخة العمل وليس النسخة المرحلية.

إحدى الطرق للقيام بذلك يمكن أن تكون:

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 المسبق :تم تغيير/إضافة الملفات).

نصائح أخرى

أنا آسف إذا كان الأمر خارج الموضوع، ولكن ألا يفترض بك إجراء نوع من الاختبارات الآلية (مما يعني أن الكود لا يحتوي على أخطاء في بناء الجملة) قبل القيام بالالتزام؟

إذا قمت بتثبيت php5-cli، فيمكنك كتابة التزامك المسبق بلغة PHP واستخدام الصيغة التي تعرفها أكثر.

فقط افعل شيئًا أشبه.

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

يتحقق تطبيق PHP الخاص بي لخطاف الالتزام المسبق مما إذا كانت الملفات المعدلة في git "خالية من الأخطاء" وأنها متوافقة مع معيار PSR2 باستخدام إما "php-code-sniffer" أو "php-cs-fixer"

#!/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);
        }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top