开发者

SVN - Get all commit messages for a file?

Is there a way to get a nice list of all commit messages sorted by file? Something like this (as you can see, I don't want the messages spec开发者_如何学Pythonific to a certain file, just show messages for the entire commit if the file was part of the commit, repeats ok):

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

Additional information:

svn log filename does something similar, but I want it to do this:

  1. get a list of files that have changed between yyyy-mm-dd (r2) and yyyy-mm-dd (r4) (i.e.
    svn log -q -v -r 2:4 > changedfiles.txt
  2. strip extraneous crap from changedfiles.txt
  3. svn log each file in that list, as in:
    svn log < changedfiles.txt >> combinedlog.txt
    (just pseudocode, i know svn log takes arguments not input, but can't be bothered to write it out)


svn log filename will show all commit messages associated with filename. The output will look something like the following:

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

If you don't want information prior to a branch or copy there is a --stop-on-copy option that you can add. See svn help log for more information, such as how to specify date ranges, etc.

EDIT:

You can easily grab by a date range using svn log -r{20100101}:{20100331}. I don't like the idea of calling log for changed files, so I'd recommend using the -v flag to get a list of files that changed in the commit.

Here's the process that I would use:

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

And here's 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>


I imagine svn log --xml and some sort of command-line XPath or XSLT is going to be your best bet.


With the command svn log


You probably need something more than just SVN to accomplish this programmatically. If .Net is not a problem, I recommend SharpSVn. The code below should get you somewhat started.

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜