Use PHP_CodeSniffer solo para líneas modificadas

Estoy intentando build un script precompromiso en SVN, y quiero ejecutar PHP_CodeSniffer únicamente en las líneas modificadas (a diferencia del file completo). Hasta ahora tengo este script:

#!/bin/sh REPOS="$1" TXN="$2" # Make sure that the log message contains some text. SVNLOOK=/usr/bin/svnlook $SVNLOOK log -t "$TXN" "$REPOS" | \ grep "[a-zA-Z0-9]" > /dev/null || exit 1 # Check for code validation before commiting the script using PHP_CodeSniffer /tmp/pear/download/PHP_CodeSniffer-1.4.3/scripts/phpcs-svn-pre-commit "$REPOS" -t "$TXN" >&2 || exit 1 # All checks passed, so allow the commit. exit 0 

En 2017, desde la publicación de CodeSniffer 3.0.0 , hay una nueva opción de --cache .

O puede usar EasyCodingStandard , que hace esto de manera pnetworkingeterminada .

Conceptualmente no tiene sentido.

phpcs necesita conocer el context del agujero para analizarlo correctamente.

Escanear solo las líneas modificadas eliminaría el context.

Así es como se hace en la herramienta de Phabricator Arcanist:

  1. ejecuta php code sniffer en cada file modificado y recostack todos los errores
  2. restringe esos errores por número de línea, donde solo se permiten los numbers de línea que se cambiaron en esta confirmación

Por supuesto, esto no cubrirá algunos casos específicos, cuando el cambio en LineA causó un error en LineB.

Es posible que intente acelerar el escaneo o evitar la introducción de nuevos problemas en el código que ya tiene una cantidad abrumadora de problemas. ( http://xyproblem.info/ )

Si estás tratando de acelerar el escaneo, me temo que es un no-go. Como dijo Max Horvath, no tiene sentido. Necesita todo el file para proporcionar el context suficiente para evaluar una nueva línea (un ejemplo simple: agrego una nueva línea que hace reference a una variable que está definida en una línea que no edité. No puede establecer si es una reference válida sin escaneando el file para encontrar references a él).

Si intenta identificar nuevos problemas, la única forma correcta de hacerlo es ejecutar 2 escaneos y comparar los resultados con y sin los nuevos cambios.

Esto no duplicará necesariamente el time de procesamiento si puede ejecutar ambos escaneos en paralelo o en los resultados del caching, pero no será más rápido, lo cual es una lástima, ya que el caso obvio para una tecnología como esta es para files muy grandes.

Averiguar si dos posts de error son iguales es un poco más complicado de lo que parece, ya que los numbers de línea cambiarán. Tendría que diferir los dos files originales y descubrir todos los desplazamientos de línea para get un resultado correcto.

Probablemente sería suficiente difuminar los numbers de línea antes de diferir los resultados y dejar que el desarrollador lo resuelva. Si dijera "Este cambio introdujo uno de estos 4 errores, pero no sé cuál", el desarrollador lo resolverá fácilmente.

Soy consciente de que el tema está desactualizado. Construyo mi propia solución para lograr este objective (el escaneo solo ha cambiado recientemente). Es prematuro pero funciona

https://github.com/ayeo/sniffer