PHP codesniffer (phpcs) - как разрешить переопределение при использовании в качестве части svn pre-commit hook? - PullRequest
2 голосов
/ 30 июля 2010

У нас есть веб-приложение на PHP 5, и в настоящее время мы оцениваем PHP CodeSniffer , чтобы решить, будет ли применение принудительных стандартов кода улучшать качество кода.

Мы используем subversion для нашего репозитория кода и базы развертывания, и я добавил SVN ловушка для предварительной фиксации , чтобы гарантировать, что все принятые файлы не содержат кодированных стандартных запахов. Хук технически работает, но вызывает слишком много головных болей, чтобы быть действительно полезным:

  1. Если нам нужно исправить непредвиденную ошибку, которая приводит к сбою сайта, последнее, что нам нужно, это запрет на коммит из-за незначительной проблемы с отступами в пробелах.
  2. У нас есть много устаревшего кода, который иногда содержит сотни ошибок phpcs - исправлять все ошибки phpcs в этих файлах прямо сейчас не прагматично. Одним из примеров является файл, полный функций, которые не имеют комментариев к документу . Другой пример: если имя класса начинается со строчной буквы, выдается ошибка, но для исправления этого может потребоваться изменение 10, 20+ файлов, для которых потребуется фиксация, которая затем будет прослушана, recurse ...
  3. У нас есть несколько файлов, которые немного велики (например, 4000 строк кода?), И phpcs проверяет их несколько минут. Задержка коммита на это долго недопустима.
  4. Я еще не проверял это, но я думаю, что если вы сделаете ветку svn и зафиксируете ее, phpcs проверит все и займет очень много времени, чтобы проверить все 1000 файлов?

Учитывая, что сегодня мы не можем реорганизовать всю нашу кодовую базу. Кто-нибудь знает, как я могу использовать параметр svn commit, который сообщит хуку svn pre-commit не запускать phpcs?

Или, может быть, есть другой способ устранения описанных головных болей?

Ответы [ 3 ]

2 голосов
/ 30 сентября 2010

Мы нашли, что следующие работы хорошо работают, уравновешивая необходимость вводить код без суеты, но предотвращая выпуски, которые расходятся с нашими стандартами.

Во-первых, у нас есть политика «распростертых объятий» в отношении коммита:

  • Весь код, работает или нет, соответствует или нет, принят: до тех пор, пока его сообщение журнала фиксации имеет идентификатор отслеживания ошибок (проверка перед фиксацией)
  • Поощряет частые коммиты и их преимущества: совместная работа, отмена, резервное копирование

Затем у нас есть политика «сжатого кулака» при сборке / выпуске сборки:

  • Сборка не выполняется, если есть, даже тривиальное отклонение от правил, что означает: обязательная правильность синтаксиса, соответствие стандартам, код документация, и все испытания проходят в полете цвета
  • Предотвращает выпуск чего-либо глючного. Если что-то глючит через, это проблема с кодом и проблема со сборкой (технологическое отверстие, недостаточно тестов и т. д.)

Все это автоматизировано с помощью phing с использованием phpcs (и, конечно, phpunit, phpdocumentor и т. Д.).

2 голосов
/ 30 июля 2010

Зачем запускать его на предварительном коммите? Я использовал PHPUnderControl и Hudson для автоматизации php-сборок ... В основном они запускают скрипт сборки ant / phing, который запускает автоматические тесты (PHPUnit) и качество кода сканеры (включая PHPCS) после каждой фиксации (определяется автоматически). Таким образом, он не отклонит фиксацию, но отправит приятное электронное письмо тому, кому вы хотите, чтобы сборка не удалась, и перечислит причину (конкретные строки нарушающего кода) ...

0 голосов
/ 31 июля 2010

Я думаю, что ircmaxell имеет отличное замечание - этот вид проверки стандартов должен быть где-то иным, чем хук перед фиксацией, например в среде с непрерывной интеграцией или в крайнем случае, ловушка после фиксации и должна основываться на информации, обеспечивающей , а не блокирующей фиксации!

Имея это в виду, я решил на данный момент , чтобы использовать opt-in подход. Я сконфигурировал ловушку svn pre-commit для поиска в сообщении коммита ключевого слова и запуска phpcs, если оно было найдено.

В скрипте ловушки перед фиксацией, например /var/www/svn/repos/<reponame>/hooks/;

#!/bin/sh

REPOS="$1"
TXN="$2"
SVNLOOK=/usr/bin/svnlook
PHPCS=/usr/bin/scripts/phpcs-svn-pre-commit

if [[ `$SVNLOOK log -t $TXN $REPOS | tr "[:upper:]" "[:lower:]"` =~ "\[?standardcode\]?" ]]; then

  # Run the PHP code sniffer                                                                                                                     
  PHPCS_STRICT=`$PHPCS "$REPOS" -t "$TXN"`
  if [[ $? -ne 0 ]]; then
      echo "$PHPCS_STRICT" >>/dev/stderr
      echo "*** Commit blocked - Please fix coding standard errors." >>/dev/stderr
      exit 1
  fi
fi

exit 0

Примечания:

  • Ключевое слово, которое я выбрал, было [standardcode], и сообщение журнала было преобразовано в нижний регистр, чтобы сделать регистр символов нечувствительным к регистру.
  • Хук фиксации phpcs (/usr/bin/scripts/phpcs-svn-pre-commit) поставляется с phpcs (по крайней мере, в CentOS 5.5).

Идея состоит в том, что разработчик может указать ключевое слово в своем сообщении о коммите как своего рода знак чести, но он не обязан проверять свой код, если он не подходит для их фиксации.

...