2010-03-17 15 views
16

C'è un modo per ottenere una bella lista di tutti i messaggi di commit ordinati per file? Qualcosa di simile a questo (come si può vedere, non voglio i messaggi specifici per un certo file, basta mostrare messaggi per l'intera impegnano se il file è stato parte del commit, ripete ok):SVN - Ottieni tutti i messaggi di commit per un file?

-- 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 

aggiuntive informazioni:

svn log filename fa qualcosa di simile, ma io voglio fare questo:

  1. ottenere un elenco di file che sono stati modificati tra aaaa-mm-gg (r2) e yyyy-mm-dd (r4) (ovvero
    svn log -q -v -r 2:4 > changedfiles.txt
  2. striscia di merda estranea da changedfiles.txt
  3. svn log ogni file in tale elenco, come in:
    svn log < changedfiles.txt >> combinedlog.txt
    (solo pseudocodice, so svn log prende argomenti non di ingresso, ma non può essere preso la briga di scrivere fuori)

risposta

14

svn log filename mostra tutto commit messaggi associati filename. L'output sarà simile alla seguente:

------------------------------------------------------------------------ 
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 
------------------------------------------------------------------------ 
... 

Se non si desidera informazioni prima di un ramo o copiare c'è un'opzione --stop-on-copy che è possibile aggiungere. Vedere svn help log per ulteriori informazioni, come ad esempio come specificare gli intervalli di date, ecc

EDIT:

Si può facilmente afferrare da un intervallo di date utilizzando svn log -r{20100101}:{20100331}. Non mi piace l'idea di chiamare registro per i file modificati, quindi mi consiglia di utilizzare il flag -v per ottenere un elenco di file modificati nel commit.

Ecco il processo che avrei usato:

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

Ed ecco 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

abbastanza vicino, sto modificando il tuo xslt. grazie – davidosomething

1

con il comando svn log

+0

Avrei dovuto copiarlo e analizzarlo (la lista svn ottiene tutto, non voglio quello) per ottenere una lista di file modificati >> changedfiles.txt, e quindi eseguire svn loggare sul contenuto di changedfiles.txt in ordine per ottenere una lista come quella che volevo. Voglio sapere se c'è un modo migliore. – davidosomething

+0

Si potrebbe anche eseguire svn log -v per ottenere i registri completi e aggegare i commenti per file. – Sjoerd

1

probabilmente avete bisogno di qualcosa di più di SVN per ottenere questo livello di programmazione. Se .Net non è un problema, mi raccomando SharpSVn. Il codice qui sotto dovrebbe iniziare in qualche modo.

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

immagino svn log --xml e una sorta di linea di comando XPath o XSLT sta per essere la soluzione migliore.

+0

XPath è per accedere ai nodi, ma l'XSLT è una buona idea, quindi ho incluso una soluzione del genere nel mio post. XQuery funzionerebbe anche. :). –

Problemi correlati