tortoise - svn conflictos
SVN-¿Obtener todos los mensajes de confirmación para un archivo? (4)
¿Hay alguna forma de obtener una buena lista de todos los mensajes de confirmación ordenados por archivo? Algo como esto (como puede ver, no quiero los mensajes específicos de un determinado archivo, solo mostrar mensajes para la confirmación completa si el archivo era parte de la confirmación, se repite):
-- 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
Información Adicional:
svn log filename
hace algo similar, pero quiero que haga esto:
- obtener una lista de 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
- tira de mierda extraña de changedfiles.txt
- svn registra cada archivo en esa lista, como en:
svn log < changedfiles.txt >> combinedlog.txt (solo pseudocódigo, sé que svn log toma argumentos no se ingresan, pero no se puede molestar en escribirlos)
Con el comando svn log
Me imagino que svn log --xml
y algún tipo de línea de comandos XPath o XSLT será su mejor apuesta.
Probablemente necesite algo más que SVN para lograr esto mediante programación. Si .Net no es un problema, recomiendo SharpSVn . El código de abajo debería hacerte comenzar un poco.
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
}
svn log filename
mostrará todos los mensajes de confirmación asociados con el filename
. La salida será similar a la 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 información antes de una sucursal o copia, puede agregar una --stop-on-copy
. Consulte el svn help log
para obtener más información, como por ejemplo, cómo especificar rangos de fechas, etc.
EDITAR:
Puede capturar fácilmente por un rango de fechas usando svn log -r{20100101}:{20100331}
. No me gusta la idea de llamar al registro para los archivos modificados, así que recomiendo usar el indicador -v
para obtener una lista de los archivos que se modificaron en la confirmación.
Aquí está el proceso que yo usaría:
svn log -r{20100101}:{20100331} -v --xml | xsltproc formatter.xsl -
Y aquí está el 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>