istributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# 3. The name of the author may not be used to endorse or promote +# products derived from this software without specific prior +# written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# exit on any failures +set -e +# report unset variables +set -u + +# svn2cl version +VERSION="0.10" + +# set default parameters +PWD=`pwd` +STRIPPREFIX="AUTOMATICALLY-DETERMINED" +LINELEN=75 +GROUPBYDAY="no" +INCLUDEREV="no" +BREAKBEFOREMSG="no" +REPARAGRAPH="no" +SEPARATEDAYLOGS="no" +ACTIONS="no" +CHANGELOG="" +OUTSTYLE="cl" +SVNLOGCMD="svn --verbose --xml log" +SVNINFOCMD="svn info" +AUTHORSFILE="" +IGNORE_MESSAGE_STARTING="" +TITLE="ChangeLog" +REVISION_LINK="#r" +TMPFILES="" + +# do command line checking +prog=`basename $0` +while [ $# -gt 0 ] +do + case "$1" in + --strip-prefix) + STRIPPREFIX="$2" + shift 2 || {} + ;; + --strip-prefix=*) + STRIPPREFIX=`echo "$1" | sed 's/^--[a-z-]*=//'` + shift + ;; + --linelen) + LINELEN="$2"; + shift 2 || {} + ;; + --linelen=*) + LINELEN=`echo "$1" | sed 's/^--[a-z-]*=//'` + shift + ;; + --group-by-day) + GROUPBYDAY="yes"; + shift + ;; + --separate-daylogs) + SEPARATEDAYLOGS="yes" + shift + ;; + -i|--include-rev) + INCLUDEREV="yes"; + shift + ;; + -a|--include-actions) + ACTIONS="yes" + shift + ;; + --break-before-msg|--breaks-before-msg) + # FIXME: if next argument is numeric use that as a parameter + BREAKBEFOREMSG="yes" + shift + ;; + --break-before-msg=*|--breaks-before-msg=*) + BREAKBEFOREMSG=`echo "$1" | sed 's/^--[a-z-]*=//'` + shift + ;; + --reparagraph) + REPARAGRAPH="yes" + shift + ;; + --title) + TITLE="$2" + shift 2 || {} + ;; + --title=*) + TITLE=`echo "$1" | sed 's/^--[a-z-]*=//'` + shift + ;; + --revision-link) + REVISION_LINK="$2" + shift 2 || {} + ;; + --revision-link=*) + REVISION_LINK=`echo "$1" | sed 's/^--[a-z-]*=//'` + shift + ;; + --ignore-message-starting) + IGNORE_MESSAGE_STARTING="$2" + shift 2 || {} + ;; + --ignore-message-starting=*) + IGNORE_MESSAGE_STARTING=`echo "$1" | sed 's/^--[a-z-]*=//'` + shift + ;; + -f|--file|-o|--output) + CHANGELOG="$2" + shift 2 || {} + ;; + --file=*|--output=*) + CHANGELOG=`echo "$1" | sed 's/^--[a-z-]*=//'` + shift + ;; + --stdout) + CHANGELOG="-" + shift + ;; + --authors) + AUTHORSFILE="$2" + shift 2 || {} + ;; + --authors=*) + AUTHORSFILE=`echo "$1" | sed 's/^--[a-z-]*=//'` + shift + ;; + --html) + OUTSTYLE="html" + shift + ;; + -r|--revision|--targets|--limit) + # add these as extra options to the command (with argument) + arg=`echo "$2" | sed "s/'/'\"'\"'/g"` + SVNLOGCMD="$SVNLOGCMD $1 '$arg'" + shift 2 || {} + ;; + --username|--password|--config-dir) + # add these as extra options to the command (with argument) + arg=`echo "$2" | sed "s/'/'\"'\"'/g"` + SVNLOGCMD="$SVNLOGCMD $1 '$arg'" + # also add to svn info command + SVNINFOCMD="$SVNINFOCMD $1 '$arg'" + shift 2 || {} + ;; + --revision=*|--targets=*|--limit=*) + # these are single argument versions of the above + arg=`echo "$1" | sed "s/'/'\"'\"'/g"` + SVNLOGCMD="$SVNLOGCMD '$arg'" + shift + ;; + --username=*|--password=*|--config-dir=*) + # these are single argument versions of the above + arg=`echo "$1" | sed "s/'/'\"'\"'/g"` + SVNLOGCMD="$SVNLOGCMD '$arg'" + # also add to svn info command + SVNINFOCMD="$SVNINFOCMD '$arg'" + shift + ;; + --stop-on-copy) + # add these as simple options + SVNLOGCMD="$SVNLOGCMD $1" + shift + ;; + --no-auth-cache|--non-interactive) + # add these as simple options + SVNLOGCMD="$SVNLOGCMD $1" + # also add to svn info command + SVNINFOCMD="$SVNINFOCMD $1" + shift + ;; + -V|--version) + echo "$prog $VERSION"; + echo "Written by Arthur de Jong." + echo "" + echo "Copyright (C) 2005, 2006, 2007 Arthur de Jong." + echo "This is free software; see the source for copying conditions. There is NO" + echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + exit 0 + ;; + -h|--help) + echo "Usage: $prog [OPTION]... [PATH]..." + echo "Generate a ChangeLog from a subversion repository." + echo "" + echo " --strip-prefix=NAME prefix to strip from all entries, defaults" + echo " path inside the repository" + echo " --linelen=NUM maximum length of an output line" + echo " --group-by-day group changelog entries by day" + echo " --separate-daylogs put a blank line between grouped by day entries" + echo " -i, --include-rev include revision numbers" + echo " -a, --include-actions add [ADD], [DEL] and [CPY] tags to files" + echo " --break-before-msg[=NUM] add a line break (or multiple breaks)" + echo " between the paths and the log message" + echo " --reparagraph rewrap lines inside a paragraph" + echo " --title=NAME title used in html file" + echo " --revision-link=NAME link revision numbers in html output" + echo " --ignore-message-starting=STRING" + echo " ignore messages starting with the string" + echo " -o, --output=FILE output to FILE instead of ChangeLog" + echo " -f, --file=FILE alias for -o, --output" + echo " --stdout output to stdout instead of ChangeLog" + echo " --authors=FILE file to read for authors" + echo " --html output as html instead of plain text" + echo " -h, --help display this help and exit" + echo " -V, --version output version information and exit" + echo "" + echo "PATH arguments and the following options are passed to the svn log" + echo "command: -r, --revision, --targets --stop-on-copy, --username," + echo "--password, --no-auth-cache, --non-interactive, --config-dir and" + echo "--limit (see 'svn help log' for more information)." + exit 0 + ;; + -*) + echo "$prog: invalid option -- $1" + echo "Try '$prog --help' for more information." + exit 1 + ;; + *) + arg=`echo "$1" | sed "s/'/'\"'\"'/g"` + SVNLOGCMD="$SVNLOGCMD '$arg'" + SVNINFOCMD="$SVNINFOCMD '$arg'" + shift + ;; + esac +done + +# find the directory that this script resides in +prog="$0" +while [ -h "$prog" ] +do + dir=`dirname "$prog"` + prog=`ls -ld "$prog" | sed "s/^.*-> \(.*\)/\1/;/^[^/]/s,^,$dir/,"` +done +dir=`dirname "$prog"` +dir=`cd "$dir" && pwd` +XSL="$dir/svn2${}.xsl" + +# check if the authors file is formatted as a legacy +# colon separated file +if [ -n "$AUTHORSFILE" ] && \ + egrep '^(#.*|[a-zA-Z0-9].*:)' "$AUTHORSFILE" > /dev/null 2>/dev/null +then + # create a temporary file + tmpfile=`mktemp -t svn2cl.XXXXXX 2> /dev/null || tempfile -s .svn2cl 2> /dev/null || echo "$AUTHORSFILE.$$.xml"` + arg=`echo "$tmpfile" | sed "s/'/'\"'\"'/g"` + TMPFILES="$TMPFILES '$arg'" + # generate an authors.xml file on the fly + echo '<authors>' > "$tmpfile" + sed -n 's/&/\&amp;/g;s/</\&lt;/g;s/>/\&gt;/g;s|^\([a-zA-Z0-9][^:]*\):\(.*\)$| <author uid="\1">\2</author>|p' \ + < "$AUTHORSFILE" >> "$tmpfile" + echo '</authors>' >> "$tmpfile" + AUTHORSFILE="$tmpfile" +fi + +# find the absolute path of the authors file +# (otherwise xsltproc will find the file relative to svn2cl.xsl) +pwd=`pwd` +AUTHORSFILE=`echo "$AUTHORSFILE" | sed "^[^/]/s|^|$pwd/|"` + +# if no filename was specified, make one up +if [ -z "$CHANGELOG" ] +then + CHANGELOG="ChangeLog" + [ "$OUTSTYLE" != "cl" ] && CHANGELOG="$CHANGELOG.$OUTSTYLE" +fi + +# try to determin a prefix to strip from all paths +if [ "$STRIPPREFIX" = "AUTOMATICALLY-DETERMINED" ] +then + STRIPPREFIX=`LANG=C eval "$SVNINFOCMD" 2> /dev/null | awk '/^URL:/{} /^Repository Root:/{} END{}else{}}'` + STRIPPREFIX=`echo "$STRIPPREFIX" | sed 's/%20/ /g'` +fi + +# redirect stdout to the changelog file if needed +if [ "x$CHANGELOG" != "x-" ] +then + exec > "$CHANGELOG" +fi + +# actually run the command we need +eval "$SVNLOGCMD" | \ + xsltproc --stringparam strip-prefix "$STRIPPREFIX" \ + --stringparam linelen "$LINELEN" \ + --stringparam groupbyday "$GROUPBYDAY" \ + --stringparam separate-daylogs "$SEPARATEDAYLOGS" \ + --stringparam include-rev "$INCLUDEREV" \ + --stringparam include-actions "$ACTIONS" \ + --stringparam breakbeforemsg "$BREAKBEFOREMSG" \ + --stringparam reparagraph "$REPARAGRAPH" \ + --stringparam authorsfile "$AUTHORSFILE" \ + --stringparam title "$TITLE" \ + --stringparam revision-link "$REVISION_LINK" \ + --stringparam ignore-message-starting "$IGNORE_MESSAGE_STARTING" \ + --nowrite \ + --nomkdir \ + --nonet \ + "$XSL" - + +# clean up temporary files +[ -n "$TMPFILES" ] && eval "rm -f $TMPFILES" + +# we're done (the previous command could return false) +exit 0 Property changes on: tools/trunk/svn2cl/svn2cl.sh ___________________________________________________________________ Name: svn:executable + Added: tools/trunk/svn2cl/svn2cl.xsl =================================================================== --- tools/trunk/svn2cl/svn2cl.xsl (rev 0) +++ tools/trunk/svn2cl/svn2cl.xsl 2008-04-17 20:35:14 UTC (rev 803) @@ -0,0 +1,496 @@ +<?xml version="1.0" encoding="utf-8"?> + +<!-- + + svn2cl.xsl - xslt stylesheet for converting svn log to a normal + changelog + + version 0.10 + + Usage (replace ++ with two minus signs which aren't allowed + inside xml comments): + svn ++verbose ++xml log | \ + xsltproc ++stringparam strip-prefix `basename $(pwd)` \ + ++stringparam linelen 75 \ + ++stringparam groupbyday yes \ + ++stringparam separate-daylogs yes \ + ++stringparam include-rev yes \ + ++stringparam include-actions yes \ + ++stringparam breakbeforemsg yes/2 \ + ++stringparam reparagraph yes \ + ++stringparam authorsfile FILE \ + ++stringparam ignore-message-starting \ + svn2cl.xsl - > ChangeLog + + This file is based on several implementations of this conversion + that I was not completely happy with and some other common + xslt constructs found on the web. + + Copyright (C) 2004, 2005, 2006, 2007 Arthur de Jong. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The name of the author may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--> + +<!DOCTYPE xsl:stylesheet [ + <!ENTITY tab "&#9;"> + <!ENTITY newl "&#38;#xA;"> + <!ENTITY space "&#32;"> +]> + +<xsl:stylesheet + version="1.0" + xmlns:xsl="9 Dating 9 Cunt XsearchLsearchT Meetingstrippeddevi a Newsletter ssearchosearchm"> + + <xsl:output + method="text" + encoding="utf-8" + media-type="text/plain" + omit-xml-declaration="yes" + standalone="yes" + indent="no" /> + + <xsl:strip-space elements="*" /> + + <!-- the prefix of pathnames to strip --> + <xsl:param name="strip-prefix" select="'/'" /> + + <!-- the length of a line to wrap messages at --> + <xsl:param name="linelen" select="75" /> + + <!-- whether entries should be grouped by day --> + <xsl:param name="groupbyday" select="'no'" /> + + <!-- whether to seperate log messages by empty lines --> + <xsl:param name="separate-daylogs" select="'no'" /> + + <!-- whether a revision number should be included --> + <xsl:param name="include-rev" select="'no'" /> + + <!-- whether aaction labels should be added to files --> + <xsl:param name="include-actions" select="'no'" /> + + <!-- whether the log message should start on a new line --> + <xsl:param name="breakbeforemsg" select="'no'" /> + + <!-- whether the message should be rewrapped within one paragraph --> + <xsl:param name="reparagraph" select="'no'" /> + + <!-- whether certain messages should be ignored --> + <xsl:param name="ignore-message-starting" select="''" /> + + <!-- location of authors file if any --> + <xsl:param name="authorsfile" select="''" /> + <xsl:key name="author-lookup" match="author" use="@uid" /> + <xsl:variable name="authors-top" select="document($authorsfile)/authors" /> + + <!-- match the topmost log entry --> + <xsl:template match="log"> + <xsl:choose> + <xsl:when test="$ignore-message-starting != ''"> + <!-- only handle logentries with don't contain the string --> + <xsl:apply-templates select="logentry[not(starts-with(msg,$ignore-message-starting))]" /> + </xsl:when> + <xsl:otherwise> + <xsl:apply-templates select="logentry" /> + </xsl:otherwise> + </xsl:choose> + <!-- add newlines at the end of the changelog --> + <xsl:text>&newl;</xsl:text> + </xsl:template> + + <!-- format one entry from the log --> + <xsl:template match="logentry"> + <xsl:choose> + <!-- if we're grouping we should omit some headers --> + <xsl:when test="$groupbyday='yes'"> + <!-- save log entry number --> + <xsl:variable name="pos" select="position()" /> + <!-- fetch previous entry's date --> + <xsl:variable name="prevdate"> + <xsl:apply-templates select="../logentry[position()=(($pos)-1)]/date" /> + </xsl:variable> + <!-- fetch previous entry's author --> + <xsl:variable name="prevauthor"> + <xsl:value-of select="normalize-space(../logentry[position()=(($pos)-1)]/author)" /> + </xsl:variable> + <!-- fetch this entry's date --> + <xsl:variable name="date"> + <xsl:apply-templates select="date" /> + </xsl:variable> + <!-- fetch this entry's author --> + <xsl:variable name="author"> + <xsl:value-of select="normalize-space(author)" /> + </xsl:variable> + <!-- check if header is changed --> + <xsl:if test="($prevdate!=$date) or ($prevauthor!=$author)"> + <!-- add newline --> + <xsl:if test="not(position()=1)"> + <xsl:text>&newl;</xsl:text> + </xsl:if> + <!-- date --> + <xsl:value-of select="$date" /> + <!-- two spaces --> + <xsl:text>&space;&space;</xsl:text> + <!-- author's name --> + <xsl:apply-templates select="author" /> + <!-- two newlines --> + <xsl:text>&newl;</xsl:text> + <xsl:if test="$separate-daylogs!='yes'"><xsl:text>&newl;</xsl:text></xsl:if> + </xsl:if> + </xsl:when> + <!-- write the log header --> + <xsl:otherwise> + <!-- add newline --> + <xsl:if test="not(position()=1)"> + <xsl:text>&newl;</xsl:text> + </xsl:if> + <!-- date --> + <xsl:apply-templates select="date" /> +