PHP codesniffer (phpcs): ¿cómo se permite sobrescribir cuando se usa como parte de un enlace de precompilation de svn?

Tenemos una aplicación web PHP 5 y actualmente estamos evaluando PHP CodeSniffer para decidir si forzar estándares de código mejora la calidad del código.

Usamos subversion para nuestro repository de código y base de implementación y he agregado un enlace de precompilation de SVN para asegurar que todos los files comprometidos estén libres de la encoding de olores estándar. El gancho funciona técnicamente pero causa demasiados dolores de cabeza para ser realmente útil:

  1. Si tenemos que corregir un error de emergencia que está causando una interrupción del sitio, lo último que necesitamos es que la confirmación sea denegada debido a un problema menor de sangría en el espacio en blanco.
  2. Tenemos MUCHO código henetworkingado que a veces tiene cientos de errores phpcs; no es pragmático arreglar todos los errores phpcs en estos files en este momento . Un ejemplo es un file lleno de funciones que no tienen comentarios de doc . Otro ejemplo es si el nombre de una class comienza con una letra minúscula y se produce un error, pero corregirlo puede implicar cambiar 10, más de 20 files que necesitarían confirmación, que luego serían olfateados, recurrentes …
  3. Tenemos algunos files que son un poco grandes (por ejemplo, 4000 líneas de código?) Y phpcs lleva varios minutos para verificarlos. Retrasar el compromiso por este time es inaceptable.
  4. Todavía no he probado esto, pero me imagino que si haces una twig svn y la comprometes, phpcs comprobará todo y tomará un time muy largo para verificar los 1000 files.

Dado que no podemos refactorizar toda nuestra base de código hoy, ¿alguien sabe cómo puedo usar un parámetro de confirmación svn que le dirá al gancho svn pre-commit que no ejecute phpcs?

¿O tal vez hay otra forma de eliminar los dolores de cabeza descritos?

¿Por qué ejecutarlo en una precomisión? He usado PHPUnderControl y Hudson para automatizar php "builds" … Básicamente, ejecutan un script de construcción ant / phing que ejecuta las testings automatizadas (PHPUnit) y los escáneres de calidad de código (incluyendo PHPCS) después de cada confirmación (detectada automáticamente) . Por lo tanto, no rechazará la confirmación, pero enviará un correo electrónico agradable a quien quiera que la compilation falle y enumerará por qué (las líneas específicas del código ofensivo) …

Hemos encontrado los siguientes trabajos bien, equilibrando la necesidad de get el código sin complicaciones, pero evitando las versiones que difieren de nuestros estándares.

En primer lugar, tenemos una política de "arms abiertos" en el compromiso:

  • Todo el código, funcionando o no, conforme o no, aceptado: siempre que su post de logging de compromiso tenga un ID de seguimiento de errores (verificación de enlace antes de la confirmación)
  • Alienta los commits frecuentes y sus beneficios: queueboración, deshacer, copy de security

Entonces, tenemos una política de "puño cerrado" en las construcciones de puesta en escena / lanzamiento:

  • La compilation falla si es que hay alguna, incluso trivial, desviación de las reglas, lo que significa: corrección de syntax obligatoria, cumplimiento de estándares, documentation del código, y todas las testings pasan con gran éxito.
  • Evita liberar cualquier cosa con errores. Si algo falla, es un problema con el código Y un problema con la construcción (agujero del process, testings insuficientes, etc.)

Todo eso es automatizado a través de phing usando phpcs (y por supuesto phpunit, phpdocumentor, etc.).

Creo que ircmaxell tiene un punto excelente: este tipo de comprobación de estándares debe ser un gancho de precompromiso, por ejemplo, en un entorno de continuous integration o en un pellizco, un enlace postcompromiso y debe basarse en proporcionar información en lugar de bloquear se compromete!

Teniendo esto en count, decidí por el momento , utilizar un enfoque de aceptación. Configuré el enlace svn pre-commit para search en el post de confirmación una palabra key y ejecutar phpcs si se encontró.

En la secuencia de commands de /var/www/svn/repos/<reponame>/hooks/ , p. Ej. /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 

Notas:

  • La palabra key que elegí fue [standardcode] y el post de logging se convirtió a minúsculas para hacer que la palabra key coincida con mayúsculas y minúsculas.
  • El phpcs commit ( /usr/bin/scripts/phpcs-svn-pre-commit ) viene empaquetado con phpcs (al less en CentOS 5.5).

La idea es que un desarrollador puede optar por poner la palabra key en su post de compromiso como una especie de insignia de honor, pero no están obligados a tener su código marcado si no es apropiado para su compromiso.