Есть ли лучший способ написать перехват git перед фиксацией, чтобы проверить любой 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
Это было полезно?

Решение

Если фиксация является частичной фиксацией (зафиксированы не все изменения в рабочем дереве), то этот make дает неверные результаты, поскольку он проверяет рабочую копию, а не промежуточную копию.

Одним из способов сделать это может быть:

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