Pregunta

¿Podrías guiarme sobre cómo? svnlook está trabajando a continuación.Quiero incluir esto en un gancho para evitar confirmaciones en una etiqueta debajo /tags:

$SVNLOOK changed -t "$TXN" "$REPOS" | grep "^U\W.*\/tags\/" && /bin/echo "Cannot commit to tags!" 1>&2 && exit 1
¿Fue útil?

Solución

Un gancho de confirmación previa de Subversion permitirá que se realice una confirmación si devuelve un código de salida de 0.De lo contrario, el gancho de precompromiso fallar y la confirmación no será procesada.

El $SVNLOOK changed -t "$TXN" "$REPOS" mostrará los cambios en $REPOS que tuvo lugar en $TXN.Las variables del shell deben ser configuradas por usted.Si miras el pre-commit script que viene con Subversion, verás:

$TXN=$1
$REPO=$2

La salida del svnlook changed El comando se ve así:

$ $SVNLOOK changed -t $TXN $REPOS
A   trunk/vendors/deli/
A   trunk/vendors/deli/chips.txt
A   trunk/vendors/deli/sandwich.txt
A   trunk/vendors/deli/pickle.txt
U   trunk/vendors/baker/bagel.txt
_U  trunk/vendors/baker/croissant.txt
UU  trunk/vendors/baker/pretzel.txt
D   trunk/vendors/baker/baguette.txt

La primera columna es si algo fue Ud.charlado, Aañadido, o Deliminado.La segunda columna se refiere a los atributos.

El resto es el nombre del archivo sobre el que se actuó.Puedes ver eso baguette.txt fue eliminado, y que una propiedad en croissant.txt se modificó, pero el archivo en sí no se actualizó.

Digamos que alguien intentó cambiar una etiqueta.La salida de svnlook changed se verá así:

$SVNLOOK changed -t $TXN $REPOS
U   tags/4.2.1/vendors/baker/bagel.txt

El comando grep es este:

grep "^U\W.*\/tags\/" 

Esto está buscando una línea que comience con ^U lo que significa que fue una actualización.Luego, busca una cadena que comience con /tags.Mmm...eso podría ser un problema.No coincide con la salida del svnlook changed dominio.

Quizás debería ser:

grep -q "^U.[[\s+tags/"

Esto coincidirá con cualquier cadena que comience con U, posiblemente seguido de otro carácter, seguido de un espacio en blanco y luego inmediatamente la palabra tags/.

Quizás quieras verificar esa expresión.

El && es un operador de lista.Si la expresión en el lado izquierdo de && se ejecuta exitosamente (es decirdevuelve un código de salida cero), se ejecutará la declaración del lado derecho.De lo contrario, la declaración de la derecha no se ejecutará.

Así, si tu grep coincide con un patrón que parece como si alguien hubiera actualizado una etiqueta, será cierto.La declaración en el lado derecho de la && será ejecutado.

De este modo,

/bin/echo "Cannot commit to tags!" 1>&2

será ejecutado.Esto se envía a STDERR, que se enviará al cliente Subversion, pero solo si el código de salida del enlace de confirmación previa es cero.

Así, el siguiente comando del operador de lista exit 1 se ejecutará si el /bin/echo es exitoso.(Puede que no lo sea, pero normalmente lo será).Con eso, el gancho de confirmación previa sale con un código de salida distinto de cero, el gancho falla y el Cannot commit to tags! se enviará al cliente SVN para que el usuario lo vea.

No hay absolutamente ninguna razón en el mundo para que esta declaración se vea así.Esto es casi equivalente y es más fácil de entender:

if $SVNLOOK changed -t $TXN $REPOS | grep -q "^U.[[\s+tags/"
then
    /bin/echo "Cannot commit to tags!" 1>&2"
    exit 1
fi
exit 0

Después de todo, necesitas poner esto en un script de shell llamado pre-commit de todos modos y tener las variables de shell $SVNLOOK, $REPOS, y $TXN establecer de todos modos.

La razón por la que esto no es del todo equivalente es que fallará en la confirmación incluso si el /bin/echo falla.


Si está buscando un gancho de confirmación previa para controlar las etiquetas, debería echar un vistazo a mío.Esto se ha probado en cientos de sitios y le brindará mucho más control sobre su repositorio y realizará una mejor verificación de errores.

Este enlace utiliza un archivo de control para controlar el acceso al repositorio.Por ejemplo, es posible que desee poder cambiar las etiquetas si es necesario.

[file You are allowed to create a new tag, but you may not make any changes to it]
file = /tags/**
access = read-only
users = @ALL

[file You are allowed to create a new tag, but you may not make any changes to it]
file = /tags/
access = add-only
users = @ALL

[file I can modify and delete tags]
file = /tags/**
access = read-write
users = jazzr

Echa un vistazo al anzuelo.Funciona con la instalación estándar de Perl 5.8.8 y superiores.No requiere otros módulos.Sin embargo, si utiliza LDAP o Active Directory para el control de acceso de Subversion, puede instalar el Net::LDAP módulo Perl y utilice grupos LDAP o Active Directory en su enlace de confirmación previa para el control de acceso.

Otros consejos

$SVNLOOK changed -t "$TXN" "$REPOS" imprime todas las rutas que fueron cambiadas.Consulte aquí para obtener más información sobre los parámetros:http://svnbook.red-bean.com/en/1.7/svn.ref.svnlook.c.changed.html

A continuación, la lista de rutas modificadas se canaliza a grep, que verifica si ha cambiado algo que tenga "/tags/" en la ruta. | grep "^U\W.*\/tags\/".

&& es un operador AND en el shell.Si el comando grep encuentra una coincidencia, devuelve el código de estado 0, que en este caso es equivalente a "VERDADERO" y el comando después de && se ejecutará; de lo contrario, no.

La parte después del &&, /bin/echo "Cannot commit to tags!" 1>&2 ejecuta el comando echo y escribe el mensaje de 1 (salida estándar) a &2, que es el error estándar.Si esto tiene éxito, el comando sale con un código de estado 1 exit 1.Esto hará que su script de gancho regrese con un código de estado distinto de cero y su confirmación fallará devolviendo el "¡No se puede comprometer con las etiquetas!" mensaje al usuario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top