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:

Diagrama gancho pre-commit del git
Diagrama gancho pre-commit del git

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:

  1. Deberá tener el nombre y ubicación adecuada
  2. 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

Fitorec

Me gusta la programación, me fascina el software libre, mis lenguajes preferidos son PHP, JavaScript, Python y Bash (aunque me gusta programar en casi cualquier lenguaje), en sistemas operativos me gusta GNU/Linux.

Más Entradas - Website

Sígueme:
TwitterGoogle PlusYouTubeDelicious

Sin Comentarios

Puedes ser el primero en comentar.

Deja un comentario

Por favor, introduzca su nombre. Please enter an valid email address. Por favor, introduzca un mensaje.