2010-03-17 8 views
16

¿Hay alguna forma de obtener una buena lista de todos los mensajes de confirmación ordenados por archivo? Algo como esto (como se puede ver, no quiero que los mensajes específicos a un determinado archivo, simplemente muestran mensajes para el envío entero si el archivo fue parte de la confirmación, se repite bien):SVN: obtenga todos los mensajes de confirmación para un archivo.

-- index.php 
    2010-01-02 03:04:05 
     * added new paragraph 
    2010-01-01 03:04:05 
     * moved header out of index.php into header.php 
     * header.php initial check-in 
    2009-12-31 03:04:05 
     * index.php initial check-in 

-- header.php 
    2010-01-03 03:04:05 
     * added new meta tags 
    2010-01-01 03:04:05 
     * moved header out of index.php into header.php 
     * header.php initial check-in 

adicional información:

svn log filename hace algo similar, pero yo quiero que haga esto:

  1. obtener una lista de los archivos que han cambiado entre aaaa-mm-dd (R2) y aaaa-mm-dd (R4) (es decir,
    svn log -q -v -r 2:4 > changedfiles.txt
  2. tira basura extraña de changedfiles.txt
  3. svn log cada archivo en esa lista, como en:
    svn log < changedfiles.txt >> combinedlog.txt
    (justo pseudocódigo, sé svn log toma argumentos de entrada no, pero no puede ser molestado en escribirlo)

Respuesta

14

svn log filename mostrará todos los mensajes de confirmación asociados con filename. La salida será algo como lo siguiente:

------------------------------------------------------------------------ 
r1206 | kalebp | 2010-03-10 16:48:12 -0800 (Wed, 10 Mar 2010) | 1 line 

Introduce a TranslatorFacade. Make the jar runnable by default. 
------------------------------------------------------------------------ 
r1085 | kalebp | 2010-03-02 17:10:28 -0800 (Wed, 04 Nov 2009) | 1 line 

Annotation checker now supports complete definitions and named parameters 
------------------------------------------------------------------------ 
... 

Si no desea que la información antes de una rama o copiar hay una opción de --stop-on-copy que se puede añadir. Ver svn help log para más información, como por ejemplo cómo especificar rangos de fechas, etc.

EDIT:

Usted puede agarrar fácilmente por un intervalo de fechas utilizando svn log -r{20100101}:{20100331}. No me gusta la idea de llamar al registro de archivos modificados, por lo que recomendaría usar el indicador -v para obtener una lista de los archivos que se modificaron en la confirmación.

Este es el proceso que iba a utilizar:

svn log -r{20100101}:{20100331} -v --xml | xsltproc formatter.xsl - 

Y aquí es formatter.xsl:

<xsl:stylesheet 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
     exclude-result-prefixes="xsd" 
     version="1.0" 
     > 

<xsl:output method="text" indent="no" /> 

<xsl:key name="paths-key" match="/log/logentry/paths" use="path" /> 

<xsl:template match="log/logentry"> 
     <xsl:for-each select="paths/path[count(. | key('paths-key', paths/path)[1]) = 1]"> 
       <xsl:sort select="text()"/> 
       -- <xsl:value-of select="text()" /> 
       <xsl:for-each select="key('paths-key', .)/preceding-sibling::date"> 
         <xsl:sort select="translate(text(), '-:.T','')"/> 
         <xsl:variable name="selectedDate" select="text()"/> 
         <xsl:value-of select="translate($selectedDate, 'T', ' ')"/><xsl:text> 
         </xsl:text> 
         <xsl:for-each select="following-sibling::msg"> 
           * <xsl:variable name="msg" select="text()"/> 
           <xsl:variable name="date" select="preceding-sibling::date/text()"/> 
           <xsl:if test="$selectedDate = $date"> 
             <xsl:text> </xsl:text> 
             <xsl:value-of select="$msg"/> 
           </xsl:if> 
         </xsl:for-each> 
       </xsl:for-each> 
     </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 
+0

lo suficientemente cerca, estoy modificando tu xslt. gracias – davidosomething

1

con el comando svn log

+0

Tendría que script y analizarlo (la lista svn obtiene todo, no quiero eso) para obtener una lista de archivos cambiados >> changedfiles.txt, y luego ejecutar svn log en los contenidos de changedfiles.txt en orden para obtener una lista como la que yo quería. Quiero saber si hay una mejor manera. – davidosomething

+0

También podría hacer svn log -v para obtener los registros completos y aggerar los comentarios por archivo. – Sjoerd

1

es probable que tenga algo más que SVN para lograr esto mediante programación. Si .Net no es un problema, recomiendo SharpSVn. El código a continuación debería ayudarte a comenzar.

var la = new SvnLogArgs { Start = 16077, End = 17445 }; 
Collection<SvnLogEventArgs> list; 
client.GetLog(new Uri(_respositoryPath), la, out list); 

foreach (SvnLogEventArgs a in list) 
{ 
    // ...jazz 
} 
3

imagino svn log --xml y una especie de línea de comandos XPath o XSLT va a ser su mejor apuesta.

+0

XPath es para acceder a los nodos, pero el XSLT es una buena idea, así que he incluido una solución de este tipo en mi publicación. XQuery también funcionaría. :). –

Cuestiones relacionadas