Hace poco escribí un post explicando como instalar CodeSniffer para validar estilo de codificación WordPress . Ahora me gustaría explicar como automatizar dicha validación mediante los puntos de enganche de sistema git.
Puntos de enganche Git Información previa
Git es un sistema de control de versiones que nos ofrece un sistema de hooks el cual es un mecanismo que nos sirve para relacionar scripts de usuario que serán ejecutados en el momento que sucede algo relevante, los ganchos(hooks) básicamente se dividen en 2 tipos los que se ejecutan en el cliente los cuales están relacionados con operaciones como confirmación(commits), combinaciones(merge). El otro tipo son los que se ejecutan en el servidor estos están relacionados con cuestiones de recepción de confirmaciones(push).
Por ejemplo en nuestro servidor podríamos programar un script que cuando reciba una confirmación este genere un mensaje con la descripción de los cambios y lo envié por correo electrónico a un grupo de desarrolladores ó lo publique automáticamente en alguna pagina (como funcionan las contribuciones en el página del ADSL). Por otra parte en el cliente podríamos relacionar otro script que revise que nuestras contribuciones cumplan ciertas reglas, tratare de explicar este funcionamiento para esto observe el siguiente diagrama:
Como se puede ver podemos relacionar el hook pre-commit el cual se ejecuta antes de que la confirmación sea realizada, este gancho también es útil para preparar el mensaje de confirmación o para realizar pruebas.
Preparando el gacho pre-commit manos a la obra
Bueno para que un gancho sea ejecutado debe de existir un script que cumpla 2 cosas:
- Deberá tener el nombre y ubicación adecuada
- Deberá tener permisos de ejecución.
Los ganchos se encuentran ubicados en la carpeta .git/hooks/
estos son disparados en función de su nombre, en este caso deseamos definir el gancho pre-commit
el cual deberá ser ejecutable, como se puede ver en las siguientes instrucciones:
# Creamos el archivo si no existe touch .git/hooks/pre-commit # Le damos permisos de ejecución chmod +x .git/hooks/pre-commit
Agregando reglas de validación de wordpress Ocupando codeSninffer + git
Si bien con codeSninffer podemos validar nuestros archivos en PHP siempre es mas cómodo automatizar dicha validación, ademas que puede llegar a ser mas seguro ya que se en alguna ocasión se nos podría llegar a olvidar revisar determinado archivo y enviarlo por error. Suponiendo que ya tenemos codeSninfer y el estándar de wordpress instalado ahora agregamos al archivo .git/hooks/pre-commit
el siguiente contenido:
#!/bin/bash # # Revisa el código cumpla simples reglas # Mayor información: # # Lista de colores a utilizar Color_Off='\e[0m' # Resetea el color BRed='\e[1;31m' # Rojo BPurple='\e[1;35m' # Morado error=0; # Revisa que el archivo no contenga espacios en blanco al final de las lineas function revisar_espacios () { grep -qE '\s+$' $1 if [ "$?" -eq "0" ] then let error=error+1 echo -ne "${BRed}Error ${error}:${Color_Off}"; echo -ne " ${BPurple}Espacios al final${Color_Off} -> "; grep -HnEo --color '\s+$' $1 fi; } # Revisa que los archivos en PHP tengan sintaxis correcta. function revisar_sintaxisPHP() { phpcs --standard=WordPress -s $1 } # Concluye el script y muestra el numero de errores(si existen) function salir_y_mostrar_errores() { if [ "$error" -ne "0" ] then echo -e "${BRed}Existen $error errores"; fi; exit $error; } ################################################################################# # Apartir de la extensión vamos a validar los archivos por confirmar # ################################################################################# for archivo in $(git diff --cached --name-only) do extension=$(basename $archivo | grep -Eo '\.[a-z0-9]+$' | sed 's/\.//g') case $extension in php) revisar_espacios $archivo; revisar_sintaxisPHP $archivo; ;; js|json|sql|css|md|txt|html) revisar_espacios $archivo; ;; esac done; salir_y_mostrar_errores;
Puede descargar este código de:
https://gist.github.com/4123345
Saltándonos la validación
Quizás por alguna razón deseamos realizar determinada confirmación pero que no pase por la validación. Bien para hacer esto y si lo pensamos podríamos renombrar el archivo pre-commit por pre-commit.sample(este nombre lo trae por defecto) o quitarle permisos de ejecución. Pero.. git ofrece una mejor alternativa que es realizar la confirmación sin verificaciones en la cual ni siquiera examina la existencia de hooks y mucho menos son ejecutados, veamos como se realiza esta:
git commit --no-verify
Sin Comentarios
Puedes ser el primero en comentar.