Showing posts with label hooks. Show all posts
Showing posts with label hooks. Show all posts

16 October 2007

Hooks SVN en Linux

Este articulo viene a raíz de uno anterior llamado

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

Se basa en el mismo caso, pero esta vez en lugar de haberlo hecho en windows + .net se ha implementado en un Red Hat + bash y se accede bajo el protocolo http con un servidor Apache.

Lo que hay que tener en cuenta es que el usuario con el que se este ejecutando el servidor Apache tenga permisos de ejecución sobre el hook.

El código del pre-commit es el siguiente:


#!/bin/bash


function log(){


echo "$1" >> /opt/repos/proyecto/hooks/pre-commit-log.txt

}



log "-------------------------------------------------------------------"

log "Usuario : $(who) "

log "Fecha : $(date --d=now +"%Y-%m-%d %T %z") "


log "Repos : $1"

log "TXN : $2"

log ""


svnlooktool=$(echo "/opt/CollabNet_Subversion/bin/svnlook changed ${1} -t ${2}" )

log "Comando : $svnlooktool"


psoutsvnlook=$($svnlooktool)


log "RAW OUTPUT : "

log "$psoutsvnlook"

log ""


psoutsvnlook=$(echo "$psoutsvnlook" awk '{for (i=2; i<=NF && $1 !="D" ; i++) s=s " " $i; print s; s=""}') log "PROCESS RAW OUTPUT : " log "$psoutsvnlook" log "" log "PROCESS OUTPUT :" declare ok=0 echo "$psoutsvnlook" while read ii; do

len_ii=${#ii}
if [ "$len_ii" -gt 0 ]; then

svnlooktool_prop=$(echo "/opt/CollabNet_Subversion/bin/svnlook propget ${1} svn:needs-lock ${ii} -t ${2}" )

log "Comando : ${svnlooktool_prop}"


psoutsvnlook_prop=$(/opt/CollabNet_Subversion/bin/svnlook propget ${1} svn:needs-lock "${ii}" -t ${2})

log "svn:needs-lock($?) : ${psoutsvnlook_prop}"


len=${#psoutsvnlook_prop}

if [ "$len" -lt 1 ]; then


log "No se ha encontrado la propiedad svn:needs-lock "


#fichero de error

#echo "El fichero \"${ii}\" necesita tener la propiedad svn:needs-lock!" > ${filename_error}


let ok=$ok+1

exit $ok

else

log "svn:needs-lock encontrado!"


fi
fi

log ""

done



if [ $? -gt 0 ]


then

echo "Se debe informar la propiedad svn:needs-lock!" >&2

exit 1

fi


exit 0


Por cierto sr Guardiola, gracias por sus conocimientos de awk. Y ud. maestro Sebas claro, el rey de los asados :-)

- FIN -

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-