Pregunta ¿Cómo busco todas las revisiones de un archivo en un repositorio de SubVersion?


me gustaría grep todas las revisiones de un archivo para una cadena. p.ej. para encontrar cuando una función fue agregada o eliminada.

¿Hay una manera "simple" de hacer esto? (es decir, un solo bash la línea de comando sería agradable.) Hacer una búsqueda binaria manual revisando revisiones y pruebas individualmente parece demasiado tedioso y propenso a errores.

Si fui lo suficientemente inteligente como para comprometer el cambio con una descripción útil, entonces puedo grep el registro con algo como:

svn log myfile.c | grep my_func

Sin embargo, esto no proporciona un número de revisión, así que sospecho que hay una mejor manera de hacerlo también.


32
2017-07-13 07:10


origen


Respuestas:


Escribí un guión para hacerlo

Uso típico:

perl searchrev.pl Import.php setImportStatus

----------------------------------------------------------------------
r19565 | johnf | 2009-06-24 14:33:00 +0100 (Wed, 24 Jun 2009) | 1 line
----------------------------------------------------------------------
line 60 $this->setImportStatus($entity_id, $entity_attr_id);
---------------------------------------------------------------------
r13722 | john | 2008-03-10 17:06:14 +0000 (Mon, 10 Mar 2008) | 1 line
---------------------------------------------------------------------
line 70 $this->setImportStatus($entity_id, $entity_attr_id);
---------------------------------------------------------------------
r11692 | paul | 2007-05-23 10:55:45 +0100 (Wed, 23 May 2007) | 1 line
---------------------------------------------------------------------
Not found
---------------------------------------------------------------------
r11691 | paul | 2007-05-23 10:36:26 +0100 (Wed, 23 May 2007) | 1 line
---------------------------------------------------------------------
Not found
---------------------------------------------------------------------
r11683 | paul | 2007-05-23 09:04:29 +0100 (Wed, 23 May 2007) | 1 line
---------------------------------------------------------------------
Not found

Aquí está el guión, fácil de hackear para sus propios fines

#!/usr/bin/perl -w

my $file=$ARGV[0];
my $pattern=$ARGV[1];

my @history=`svn log $file`;
foreach (@history)
{
    chomp;
    if (m/^r(\d+)/)
    {
        my $revision=$1;
        my $sep='-' x length($_);

        print "$sep\n$_\n$sep\n";

        my @code=`svn cat -r $revision $file`;
        my $lineno=0;
        my $found=0;
        foreach my $line (@code)
        {
            $lineno++;
            if ($line=~m/$pattern/)
            {
                $line=~s/^\s+//;
                print "line $lineno $line";
                 $found=1;
            }
        }

        print "Not found\n" unless ($found);
    }
}

32
2017-07-15 10:12



los comando "anotar / culpar" no hace exactamente lo que quiere, pero podría ayudar:

svn culpa - Mostrar información de autor y revisión en línea para los archivos o URL especificados.

 $ svn blame http://svn.red-bean.com/repos/test/readme.txt
 3      sally This is a README file.
 5      harry You should read this.

Entonces, debería poder averiguar quién agregó una función. En cuanto a averiguar quién borró una función, no tengo idea.


7
2017-07-13 08:07



Con un servidor Subversion 1.6 y su mod_dav_svn puede especificar el número de revisión a través de un parámetro GET:

http://host/repos/path?r=20

Entonces puedes fácilmente wget sus archivos en todas las revisiones y luego diff ellos.

Fuente: SVN 1.6 changelog


3
2017-07-13 08:41



Este es un comando para buscar revisiones de un archivo que contiene una cadena:

svn log -l 30 -q FILENAME | grep ^r | cut -d ' ' -f 1 | while read rev; do
    svn cat -$rev FILENAME | grep -c PATTERN && svn info FILENAME@$rev
done

2
2018-03-11 09:19



Lo primero que quieres hacer será difícil. Normalmente sugeriría usar svn diff o svn cat, pero no hay (hasta donde yo sé) ninguna forma de obtener el número de revisión en línea con la salida del código.

En la segunda pregunta, si está buscando un usuario específico, puede usar

svn log | grep -A 2 username

que le dará dos líneas adicionales después de cada línea coincidente (-A = "después"). Si no tiene mensajes de registro muy largos, puede usar

svn log | grep -B 2 search_string

que de manera similar imprimirá dos líneas antes (-B) cada línea coincidente. (Que debería ser suficiente para darle el número de revisión.) Estoy absolutamente seguro de que hay una manera mejor con AWK de darle los números de revisión en línea con los mensajes de registro, pero estoy cansado y no puedo pensar de eso ahora mismo :RE


1
2017-07-13 07:24



Hasta donde sé, eso no es fácilmente posible. Escribía un pequeño script que recuperaba cada conjunto de cambios para el archivo en cuestión y luego grep a través del diff para la cadena. Entonces es tan simple como imprimir el número de revisión actual :)


0
2017-07-13 08:33



Podrías usar el pySVN + la pitón herramientas de diferencia para hacer esto, si bien no es bash, tal vez valga la pena considerarlo si usa esta función de forma más regular. Es una versión de wget solución pero tendría una interfaz más agradable, bueno si la construyes :)


0
2017-07-13 15:51