18 September 2007

Hooks para SVN - Comprobación de propiedades - Bloqueo de ficheros

En determinadas ocasiones nos interesara poner atributos en nuestros ficheros de SVN, como por ejemplo para poder bloquearlos exclusivamente y asi evitarnos los fastidiosos merges e inconsistencias de codigo que en determinadas ocasiones se originan.

El atributo que se necesita para obligar el bloqueo exclusivo es el svn:needs-lock, y este ha de estar en todos nuestros ficheros del control de versiones; pero claro esta es una tarea engorrosa y algún miembro del equipo puede obiarlo por descuido :-p . Asi que no esta de mas comprobar la existencia del atributo en el servidor justo cuando hacen el commit de los ficheros.

Para ello SVN nos provee de una serie de hooks, en concreto el que se adapta a esta necesidad es el hook llamado pre-commit, que se ejecuta antes de confirmar la transacción, devolviendo un entero distinto de cero(-1) si no se cumple con las condiciones, con lo cual se realiza un rollback de la transacción.

Creo que no esta demas recalcar que en una transacción se pueden subir/actualizar/eliminar varios ficheros y que si la transacción falla ninguno de los ficheros afectados se actualiza en el servidor.

Pues bien para comprobar que todos los ficheros de la transacción tengan el atributo svn:needs-look habría que hacer lo siguiente:



  1. Crear nuestro hook llamado pre-commit(.pl, .py, .bat, .exe, ...), este recibe como parametros el repositorio y el numero de transacción actual.


  2. Recoger la lista de ficheros afectados con la utilidad svnlook utilizando la opción changed, pasandole el repositorio y la transacción en cuestión.


  3. Por cada fichero devuelto habria que volver a utilizar la utilidad svnlook, pero esta vez con la opción propget, pasandole el nombre de la propiedad a buscar, el repositorio, el fichero y finalmente el codigo de la transacción.


  4. Si alguno de las invocaciones svnlook proget da un error de propiedad no encontrada, se escribe por la corriente de salida de error el mensaje en cuestión y se devuelve un -1.



De esta manera, con este hook obligamos a que todos los usuarios que añadan nuevos ficheros pongan este atributo, y que aquellos ficheros que ya estan en el servidor sigan teniendolo, no sea que algún miembro del equipo lo quite por equivocación :-P

Un ejemplo de hook pre-commit en .NET lo podeis encontrar en la siguiente dirección :

Interactuando con programas externos a nuestra aplicación.

Un ejemplo de hook pre-commit en bash de Linux lo podeis encontrar en:

Hooks SVN en Linux



-FIN-

No comments: