Esta pregunta se hace también un poco viejo, pero he creado un script que puede ser útil para informes/auditorías simples de Subversion y d para realizar un seguimiento de los cambios realizados en un repositorio SVN y quería compartirlo. Extrae información de acerca de las confirmaciones de SVN de forma similar al comando "svnlook", pero tiene un par de ventajas. En primer lugar, permite iterar sobre todas las revisiones de un repositorio para realizar un seguimiento de todos los cambios realizados. En segundo lugar, la información está impresa en un formato tabular separado por tabulaciones (como en comandos de Unix como ps o df) que es legible para los humanos y fácil de analizar o importar a una hoja de cálculo, lo cual es excelente para generar informes. También se puede llamar o incrustado en un enlace SVN post-commit.
Es una secuencia de comandos Perl llamada svn-commit-info.pl y tiene tres argumentos. El primero es la ruta del repositorio y es obligatorio. El segundo, opcional, es el patrón de archivo para buscar. Y el tercero, también opcional, es el número de revisión para consultar.
Si se ejecuta solo con la ruta del repositorio, imprime en STDOUT información sobre los archivos afectados por todas las confirmaciones realizadas en el repositorio. Por ejemplo, suponiendo que el repositorio se almacena en/svn/repos/prueba en el servidor Subversion:
$ perl svn-commit-info.pl /svn/repos/test
# Repository: /svn/repos/test
# Fields: Action, Revision, Date, Author, Bytes, Path
# Actions: A = New, D = Deleted, U = Updated
A 1 2017-01-31 17:21:19 Samsa <DIR> TestProject/
A 2 2017-01-31 17:21:33 Samsa 815 TestProject/.project
A 2 2017-01-31 17:21:33 Samsa <DIR> TestProject/.settings/
A 2 2017-01-31 17:21:33 Samsa 564 TestProject/.settings/.jsdtscope
A 2 2017-01-31 17:21:33 Samsa <DIR> TestProject/www/
A 3 2017-01-31 17:27:48 David 355 TestProject/www/test.html
A 3 2017-01-31 17:27:48 David <DIR> TestProject/www/css/
A 3 2017-01-31 17:27:48 David 9622 TestProject/www/css/logo.jpg
A 3 2017-01-31 17:27:48 David 1231 TestProject/www/css/reportstyle.css
A 3 2017-01-31 17:27:48 David 168345 TestProject/www/css/style.css
U 4 2017-02-01 10:48:34 Samsa 183260 TestProject/www/css/style.css
D 5 2017-02-01 12:51:26 David 355 TestProject/www/test.html
Los campos separados por tabuladores son: la operación realizada, el número de revisión, la fecha y hora, el autor de la revisión, el tamaño del archivo en bytes (a menos que el archivo sea un directorio marcado con la cadena "<DIR>") y la ruta del archivo afectado en el repositorio . Las tres primeras líneas contienen comentarios orientados a los humanos sobre el resultado.
La salida del comando anterior puede tardar mucho tiempo en completarse si el repositorio es grande, con muchos archivos o revisiones . Si desea realizar un seguimiento de los cambios realizados en un archivo en particular (o un conjunto de archivos), es mejor para especificar el patrón de archivo (que, de hecho, es una expresión regular de Perl). Por ejemplo, para obtener información sobre los cambios realizados en el archivo style.css:
$ perl svn-commit-info.pl /svn/repos/test style.css
Si usted está interesado en una revisión en particular, puede especificar el tercer parámetro. Por ejemplo, imprimir todos los cambios de la tercera revisión, teniendo en cuenta que '.' coincide con cualquier carácter en un Perl expresiones regulares:
$ perl svn-commit-info.pl /svn/repos/test . 3
Y, por supuesto, se podría aprovechar el poder de los filtros de Unix y la canalización para hacer consultas más complejas, por ejemplo, para encontrar todas las modificaciones realizadas por el usuario David:
$ svn-commit-info.pl /svn/repos/test | grep David
permite encontrar todos los archivos creados con tamaño> = 1Mb:
$ svn-commit-info.pl /svn/repos/test | awk '$1 = "A" && $6 ~ /[0-9]/ && $6 >= 1024*1024'
la secuencia de comandos utiliza el comando estándar subversión "svnlook "pero de lo contrario es autónomo". Hay son dos funciones auxiliares para construir el comando y obtener el resultado de "svnlook" y luego realiza llamadas sucesivas a el comando para componer el resultado. Requiere Subversion> = 1.7 y tiene probado en Perl 5.10.
#!/usr/bin/env perl
use strict;
my $SVNLOOKCMD = "/usr/bin/svnlook";
my @FIELDS = qw(Action Revision Date Author Bytes Path);
# Builds and returns the "svnlook" command
sub svnlook_cmd {
my($repository, $action, $revision, @varargs) = @_;
my $cmd = $SVNLOOKCMD;
$cmd.= " -r $revision" if $revision;
$cmd.= " $action '$repository'";
$cmd.= join "", map { " '$_'" } @varargs;
$cmd.= '|';
return $cmd;
}
# Executes the "svnlook" command and returns the output lines
sub svnlook_output {
my($repository, $action, $revision, @varargs) = @_;
open(my $svnlookfh, svnlook_cmd $repository, $action, $revision, @varargs);
my @output = <$svnlookfh>;
close $svnlookfh;
chomp @output;
return wantarray ? @output : $output[0];
}
my($repository, $file, $revision) = @ARGV;
unless($repository) {
# 'repository' is the only mandatory argument
print STDERR "$0 <repository> [<file>] [<revision>]\n";
print STDERR "\t<repository> = path of Subversion repository\n";
print STDERR "\t<file> = file pattern to search for (regular expression)\n";
print STDERR "\t<revision> = commit revision number\n";
exit 1;
}
$file = "." unless $file;
my $first = $revision ? $revision : 1;
my $last = $revision ? $revision : svnlook_output $repository, "youngest";
print "# Repository: $repository\n";
print "# Fields: ", join(", ", @FIELDS), "\n";
print "# Actions: A = New, D = Deleted, U = Updated\n";
for(my $rev = $first; $rev <= $last; $rev++) {
my $author = "";
my $date = "";
foreach my $line (svnlook_output $repository, "changed", $rev) {
if($line =~ /$file/i) {
unless($date) {
$date = svnlook_output $repository, "date", $rev;
$date =~ s|^(\S+) (\S+).*$|\1 \2|;
}
$author = uc svnlook_output $repository, "author", $rev unless $author;
my($action, $path) = split /\s+/, $line, 2;
my $size;
if($path =~ m|/$|) {
$size = sprintf("%12s", "<DIR>");
} else {
$size = svnlook_output $repository, "filesize", $rev, $path;
$size = sprintf("%12d", $size);
}
print join("\t", $action, $rev, $date, $author, $size, $path), "\n";
}
}
}
exit 0;
Espero que esto ayude y lo siento por el largo mensaje.
¿Qué rastreador de problemas usas? Por lo general, un rastreador de problemas proporciona algunos informes del repositorio. – Joshua
Utilizamos un rastreador de problemas personalizado, que no es compatible con nada. – Bravax