2009-12-07 11 views
5

¿Es posible utilizar el mensaje de confirmación en un enganche de precomisión en CVS? El servidor CVS se está ejecutando de forma remota, y yo puedo acceder usando pserver.Utilice el mensaje de confirmación en un gancho de precompilación de CVS

Idealmente, quiero permitir la confirmación si los archivos pasan el filtro o el mensaje de confirmación contiene cierto texto.

No tengo la opción de utilizar otro sistema de control de versiones.

Respuesta

3

Éstos son algunos tutoriales útiles para leer más:

http://durak.org/sean/pubs/software/cvsbook/The-commitinfo-And-loginfo-And-rcsinfo-Files.html
http://durak.org/sean/pubs/software/cvsbook/The-verifymsg-And-rcsinfo-Files.html#The-verifymsg-And-rcsinfo-Files

No se puede hacer lo que quiera con sólo un gancho, pero se pueden utilizar dos ganchos, commitinfo se lo hará Verifique los archivos ellos mismos y verifymsg le permitirá verificar el mensaje. Ambos pueden usarse para cancelar la confirmación (los programas solo necesitan salir con el estado 1). En caso de que no lo supiera, checkoutlist, commitinfo y 'verifymsg' pueden encontrarse en el directorio CVSROOT de su repositorio. Yo recomendaría poner cualquier script que escribas como ganchos en ese directorio, pero realmente no importa ya que puedes especificar la ruta completa. Además, Perl no es necesaria o requerida, sólo simple para mí escribir algunos ejemplos (tontos) en:

checkoutlist

# these files will be automatically checked out for you 
acceptable 

verifymsg

# specifies which file to run as hook, %l is filename of log message 
# bar$  /path/to/repo/CVSROOT/verify_ends_in_bar %l 
DEFAULT /path/to/repo/CVSROOT/acceptable %l %s 

aceptable

#/usr/bin/perl -w 

use strict; 
use warnings; 

# this would be simpler if cvs passed sane arguments 
my ($logfile, $dir, @files) = @ARGV; 
my $grep = `grep -i 'accept liability' $logfile`; 
exit 0 if $grep; 

my $found = 0; 
foreach my $file (@files) { 
    my $path = join '/', $dir, $file; 
    die "Can't find file $path" if ! -e $path; 
    my $grep = `grep -i 'evidence of any deliberation' $path`; 
    $found++ if $grep; 
} 
die "You must accept liability or show evidence of deliberation" if $found < @files; 

Caveat Emptor: escribí la mayor parte de esto sin ninguna prueba, así que no puedo garantizar que funcione, pero debería conseguirte al menos cerca.

Editar nuevo, sólo se dio cuenta de que yo era originalmente mal y se puede pasar tanto el archivo de registro y los nombres de archivo comprometidos a verifymsg haciendo la respuesta un poco más simples.

+0

¿Con qué versión de CVS ha probado esto? Con mi versión, cuando especifico% s en el archivo 'verifymsg' no obtengo los archivos comprometidos, solo obtengo el archivo de registro. – dreamlax

+0

@dreamlax Nunca he tenido la necesidad de usar 'verifymsg' como lo hizo, solo he usado' loginfo' y 'commitinfo' pero pensé que había encontrado algunos ejemplos en línea que mostraban que' verifymsg' aceptaba tanto el registro archivo y% s. Si eso no funciona para usted, es posible que deba recurrir a algún tipo de comunicación entre un script 'commitinfo' y el script' verifymsg'. –

+0

@dreamlax Además, ¿podrías conformarte con requerir ambos criterios? Entonces una versión anterior de mi respuesta que usaba commitinfo y verifymsg funcionaría. Supongo que depende de si te referías a ** o ** lógico o más típicamente inglés ** o **. –

1

Puede usar el archivo verifymsg en el directorio CVSROOT. Puede configurarlo para llamar a un script que pueda verificar el contenido del comentario de checkin. Puede rechazar la confirmación devolviendo un valor distinto de cero.

El archivo verifymsg predeterminado contiene más detalles.

+0

Quiero rechazar la confirmación si falla el enganche precomprometido * y * el mensaje de registro * no * contiene "Acepto responsabilidad" o lo que sea. El enlace de precompilación garantiza que los archivos sean válidos, pero en el caso de que sea necesario confirmar los archivos que infringen las reglas, quiero asegurarme de que el registro lo mencione. Quiero poder verificar tanto el mensaje confirmado * como * los archivos comprometidos antes de permitir la confirmación. – dreamlax

+0

El problema es que el enlace precompromiso no parece poder acceder al mensaje de confirmación para garantizar que la verificación fallida se registra como deliberada, y el enlace verifymsg no puede acceder a los archivos modificados para verificar que los cambios cumplen con las reglas. – dreamlax

+0

Tiene razón, la verificación no puede obtener los archivos que se están comprometiendo. Tendría que implementarlos por separado. Entonces, si uno falla, la confirmación total fallará. ¿Hace eso lo que quieres? Además, para aclarar, por lo que recuerdo, no puede obtener los archivos reales en el enlace precompromiso, simplemente le dicen las rutas/nombres. –

3

El módulo Perl CVS::Trigger parece tener una función experimental que permite el almacenamiento en caché de valores entre la llamada de diferentes activadores. La página menciona explícitamente la transferencia de los nombres de archivos de commitinfo a verifymsg, por lo que tal vez le ayude a lograr lo que desea.

+0

Gracias por eso. Me gustaría ir por esta respuesta, excepto que como dijiste que es experimental, y necesito algo un poco más concreto. – dreamlax

0

He estado lidiando con el mismo problema. Hasta ahora, mi mejor solución ha sido obtener el Id. Del proceso principal (getppid()) y usarlo en un archivo temporal al que puedo poner la lista de archivos desde commitinfo. Este ID padre parece ser el mismo para el proceso de verificación (al menos en AIX). Buena suerte.

Cuestiones relacionadas