Utilizzare il messaggio di commit in un CVS pre-commit hook
-
13-09-2019 - |
Domanda
E 'possibile utilizzare il messaggio di commit in un gancio pre-commit nel CVS? Il server CVS è in esecuzione da remoto, e ho accedere mediante pserver
.
Idealmente, voglio permettere il commit se i file passano il filtro o il messaggio di commit contiene un determinato testo.
Non ho una scelta di utilizzare un altro sistema di controllo delle versioni.
Soluzione
Ecco alcuni tutorial utili per saperne di più:
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
Non si può fare quello che vuoi con un solo gancio, ma è possibile utilizzare due ganci, commitinfo
vi permetterà di verificare i file stessi e verifymsg
vi permetterà di verificare il messaggio. Entrambi possono essere utilizzati per annullare il commit (i programmi solo bisogno di uscire con stato 1). Nel caso in cui non erano a conoscenza, checkoutlist
, commitinfo
e 'verifymsg' si possono trovare nella directory CVSROOT del repository. Suggerirei di mettere tutti gli script si scrivono come ganci in quella directory pure, ma non importa come si arriva a specificare il percorso completo. Inoltre, perl non è necessario o richiesto, solo semplice per me scrivere alcuni esempi (sciocche) in:
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
accettabile
#/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: Ho scritto la maggior parte di questo fuori dalla parte superiore della mia testa con nessun test quindi non posso garantire che funziona ma dovrebbe arrivare almeno vicino
. Modifica di nuovo , ho capito che ero in origine sbagliato e si può passare sia il file di log e i nomi dei file impegnati per verifymsg
rendere la risposta un po 'più semplice.
Altri suggerimenti
Il CVS :: trigger modulo Perl sembra avere un sperimentale funzione che consente per i valori di cache tra il richiamo di diversi trigger. La pagina menziona esplicitamente passando i nomi dei file da commitinfo a verifymsg, così forse ti aiuta a raggiungere ciò che si desidera.
È possibile utilizzare il file nella directory verifymsg
CVSROOT
. È possibile configurarlo per chiamare uno script in grado di verificare il contenuto del commento checkin. È possibile rifiutare il commit restituendo diverso da zero.
Il file predefinito verifymsg contiene ulteriori dettagli.
Ho avuto a che fare con lo stesso problema. Finora il mio migliore soluzione è stata quella di ottenere l'ID processo padre (getppid ()) e usarlo file temporaneo ina che posso mettere l'elenco dei file in da commitinfo. Questo ID genitore sembra essere lo stesso per il processo verifymsg (su AIX almeno). Buona fortuna.