проверка синтаксиса git hook - PullRequest
       2

проверка синтаксиса git hook

7 голосов
/ 15 сентября 2010

Попытка подключить проверку синтаксиса php для git-репозитория.Я был счастлив, когда нашел фрагмент кода, который делает именно это.

Но, похоже, у сценария фрагмента есть недостаток.Он выполняет

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

, чтобы получить список файлов в индексе.Теперь он запускает php -l для каждого файла в этом списке.Недостаток в том, что файл может отличаться между рабочей копией и областью подготовки.Если в промежуточной области php есть синтаксическая ошибка, а в версии рабочей копии нет, синтаксическая ошибка не найдена, а фиксация завершена успешно, что было необходимо предотвратить.каким-нибудь образом запустить php -l для staging-версии каждого файла?

Ответы [ 3 ]

7 голосов
/ 15 сентября 2010

Я очень счастлив, используя эту проверку синтаксиса PHP Надеюсь, что это будет соответствовать вашим потребностям.

Используется git diff-index --cached --full-index.

3 голосов
/ 15 сентября 2010

Я не уверен, что здесь есть проблема.

Упомянутый вами фрагмент, вероятно, взят из сообщения в блоге Не совершайте эту ошибку .
И он включает в себя:

Далее мы вызываем git diff-index с несколькими параметрами.
Во-первых, мы добавляем --cached, чтобы сообщить Git, что мы хотим только файлы, которые будут зафиксированы .
Затем мы добавляем --name-only, чтобы сообщить Gitвыводить только имена файлов, которые фиксируются.

Кажется, что файлы, которые должны быть зафиксированы, являются именно теми, которые хук перед фиксацией захочет проверить.
Дажеесли они отличаются от файлов в рабочем каталоге, то их версия (в индексе) должна быть зафиксирована.И это та же самая версия, которая будет отправлена ​​процессу php -l.


На самом деле, проблема не в самом git diff-index (с или без --full-index) в путиВы прочтете содержимое файла в индексе

  • Хук "PHP Advent 2008" просто попытается получить доступ к файлу по его имени (сриск доступа к рабочей копии)
exec("php -l " . escapeshellarg($file), $lint_output, $return);
result=$(git cat-file -p $sha | /usr/bin/env $PHP_BIN -l 2>/dev/null)

Использование git cat-file - ключ здесь для доступа к объекту вGit репо (то есть не в «рабочем каталоге»)

0 голосов
/ 30 сентября 2012

Причина pre-commit ловушка не подходит для работы в команде, вы должны использовать pre-receive hook, установленный на стороне сервера, чтобы отклонить все коммиты с неверным синтаксисом php и неправильным кодированиемстандарт.

Я создал pre-receive Python-скрипт для этой цели:

# 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...