SVN Hooks

  • ¿Alguna vez vieron el log de una revisión SVN y notaron que el comentario está en blanco? (lo cual no es muy aconsejable)
  • ¿Alguna vez escucharon esta frase?

- Gente, acabo de commitear un par de clases, háganse un update.

Bien, los hooks del SVN están para ayudarnos. Por ejemplo, en el primer caso impedir un commit sin comentario. En el segundo caso realizando un aviso vía mail de una nueva revisión en los fuentes. Cada vez que se dispara un evento SVN (por ejemplo: un commit, un lock), SVN busca en el directorio hooks ciertos archivos a fin de realizar acciones preventivas, de aviso, etc. Vamos a enfocarnos en dos hooks específicos: pre-commit y post-commit (antes y después de un commit), los cuales hay que crearlos. El directorio hooks ya trae algunos ejemplos (con extensión .tmpl) para hacernos una idea de su uso. Tener en cuenta que los archivos pre-commit y post-commit deben tener permisos de ejecución:

chmod 755 pre-commit 
chmod 755 post-commit

Verificando el comentario en un commit

El archivo pre-commit debería contener algo así:

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 || "Es necesario escribir algo en el log" > STDERR


En este caso, REPOS y TXN (repositorio y transacción) son parámetros que el SVN se encarga de pasarle al script. El svnlook obtiene el detalle del log de la transacción en curso, grep recibe dicha salida e imprimirá en /dev/null solo si es que existen letras y/o números (y llegando así a buen puerto). En caso contrario, por la salida de error standard se imprimirá el mensaje de error, el cual SVN usará para informar al usuario.

 Enviando mails informando un nuevo commit

Esto requiere un poco más de trabajo, ya que es necesario contar con Perl instalado. Posteriormente vamos a necesitar copiar al directorio hooks del repositorio el script de perl encargado del envío del mail. Según la instalación, el mismo puede ubicarse en: /usr/share/doc/subversion-1.4.2/tools/hook-scripts/commit-email.pl El archivo post-commit debería contener algo así:

REPOS="$1"
REV="$2"

/usr/bin/perl commit-email.pl "$REPOS" "$REV"   –from origen@dominio.com -s "Nueva revision SVN"   –diff n destino1@dominio.com, destino2@dominio.com


Nuevamente REPOS y REV son parámetros que el SVN se encarga de pasarle al script. Se invoca a commit-email.pl con los parámetros recién comentados y con ciertos modificadores:
  –from origen indica el mail remitente
  - s especifica el prefijo del subject del mail
  –diff n envía a mi gusto un mail de aviso más prolijo, ya que omite el detalle de diferencias en cada componente. Por último se especifican los destinatarios que recibirán la notificación.

Ciertamente el potencial de los hooks es mucho mayor, pero éste es un comienzo interesante.

4 Comments

Andrés RíosOctober 22nd, 2008 at 8:36 pm

Saludos

Amigo, resulta que tengo un proyecto el cual controlo por SVN y Tortoise y necesito adicionarle el escript o gancho para no dejar hacer la confirmación sin comentario segui tus paso hasta donde los entendi. En el gancho de confirmación de mi repositorio le adicione tus lineas pero hago confirmación sin comentario y me deja. Nota: yo estoy trabajando en Windows; sera ese el problema??. Muchas gracias por tu ayuda. Andrés Ríos

FedeOctober 22nd, 2008 at 9:40 pm

Andrés, gracias por pasar!

Bien, la primer pregunta sería… ¿con qué estás reemplazando el grep? Windows tiene programas similares como find o findstr, habría que chusmear por ahí (ver wiki, apartado Variaciones).

Respecto a la semántica del doble pipe, en esta referencia especifica: The double pipe (||) causes the command following this symbol to run only if command preceding symbol fails., con lo cual eso no no debería traer problemas.

Saludos y suerte!

erwinSeptember 21st, 2010 at 2:27 pm

Como configuro el archivo para que cada vez q haga un commint el svn ignore todos los *.class y los archivos q sean _EJS*.* y EJS*.*

Haciendo la aclaracion q el “*” representa cualquier conjunto de letras.

Gracias

deltoroJune 24th, 2011 at 3:17 am

como un hook?? no entiendo nada de verdad estoy en problemas

Leave a comment

Your comment