He creado un entorno similar con el Tortoise Docs y puedo decir: ¡Sí, lo es! operación implica un gancho start-commit que llena en las líneas que el usuario deberá leer y un gancho pre-commit que elimina thee líneas de nuevo:
start-commit gancho
Este gancho se pasa tres parámetros: PATH MESSAGEFILE CWD
. MESSAGEFILE
es la ruta a un archivo temporal que se usará para almacenar el mensaje de confirmación. Puede completar este archivo temporal con su mensaje ¡No olvide hacer X! O, prefije su mensaje con algo que tratará como comentario en el mensaje de confirmación y se filtrará. Dado que Git usa #
como comentario en el mensaje de confirmación, hice lo mismo: cada línea que comienza con #
se filtra del mensaje de confirmación. Y, por lo tanto, escribiría el mensaje # Don't forget to do X!
. implementación de ejemplo en Perl (no probado):
use strict; # what we always have
use warnings; # what we always have
use Fcntl ':flock'; # lock files when writing
use Carp; # use croak instead of die
use English qw(-no_match_vars); # words instad of cryptic variables
sub startcommit_hook{
# open the logfile
my $logfilename = $ARGV[1];
# write hint line about supported tags
open my $handle, '>:utf8', $logfilename
or croak "Opening $logfilename for writing failed\n";
flock $handle, LOCK_EX;
print {$handle} "# Don't forget to do X!\n";
flock $handle, LOCK_UN;
return close $handle or croak "unable to close $OS_ERROR";
}
startcommit_hook();
gancho pre-commit
Este gancho se pasa cuatro parámetros: PATH DEPTH MESSAGEFILE CWD
. El trabajo del gancho de precompromiso es filtrar el mensaje que completó en MESSAGEFILE
en el enlace de inicio de la ejecución (de lo contrario irá como parte del mensaje de confirmación al servidor y probablemente esto no es lo que desea) . O simplemente borre su mensaje ¡No olvide hacer X! o – si usa el enfoque de comentario como escribí anteriormente – elimine cada línea que comience con un signo #
(o que coincida con el patrón ^\s*#
) ya que es un comentario en nuestro mundo.
Podríamos extender nuestro archivo para el enganche start-commit para manejar también las cosas precompuestas ya que el número de parámetros es diferente. La decisión sobre el gancho para llamar está compuesta por el parámetro de recuento de pasadas al script (también no probado):
use strict; # what we always have
use warnings; # what we always have
use feature 'switch'; # for given-when construct
use Fcntl ':flock'; # lock files when writing
use Carp; # use croak instead of die
use English qw(-no_match_vars); # words instad of cryptic variables
sub startcommit_hook{
# open the logfile
my $logfilename = $ARGV[1];
# write hint line about supported tags
open my $handle, '>:utf8', $logfilename
or croak "Opening $logfilename for writing failed\n";
flock $handle, LOCK_EX;
print {$handle} "# Don't forget to do X!\n";
flock $handle, LOCK_UN;
return close $handle or croak "unable to close $OS_ERROR";
}
sub precommit_hook{
my $logfilename = $ARGV[2];
# first, read the logfile
open my $handle,'<:utf8',$logfilename or croak "Error reading file contents of $logfilename: $OS_ERROR\n";
my @content = <$handle>;
close $handle or croak "unable to close: $OS_ERROR";
chomp @content;
# now, write it, ignoring the comment lines
open my $handle, '>:utf8', $logfilename
or croak "Opening $logfilename for writing failed\n";
flock $handle, LOCK_EX;
foreach my $line(@content){
if($line !~ /^\s*#/){ # line has no comment, print it.
print {$handle} $line . "\n";
}
}
flock $handle, LOCK_UN;
close $handle or croak "unable to close $OS_ERROR";
return;
}
given($#ARGV){
when (3){startcommit_hook();}
when (4) {precommit_hook();} # no user supplied -> auto lookup
default {croak "Invalid number of parameters";}
}
Para activar los ganchos, abra la configuración de TortoiseSVN, vaya a hook scripts
y añadir el guión una vez, ya start-commit hook y una vez como pre-commit hook. La línea de comando para llamar sería perl /path/to/script
. Y también marque Wait for the script to finish
y Hide script while running
.
Nota
Si necesita más información que pasa a los ganchos, también se puede pasar parámetros personalizados cuando asigne los ganchos en la configuración de TortoiseSVN. Si asigna parámetros personalizados, estos se pasan al enganche antes de los parámetros predeterminados (como se indica en el docs) pasan.