Mercurial > hg > buildtools
changeset 1:2375efb3340d
Added a modified version of svn2cl and the XSL stylesheet.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Fri, 09 May 2008 14:12:09 +0300 |
parents | d72d5d73b93a |
children | 4cf32ca7b15e |
files | svn2cl svn2cl.xsl |
diffstat | 2 files changed, 428 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/svn2cl Fri May 09 14:12:09 2008 +0300 @@ -0,0 +1,133 @@ +#!/bin/sh + +# svn2cl.sh - front end shell script for svn2cl.xsl, calls xsltproc +# with the correct parameters +# +# Copyright (C) 2005-2008 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. + +# exit on any failures +set -e + +# svn2cl version +VERSION="0.2" + +# set default parameters +STRIPPREFIX=`basename $(pwd)` +LINELEN=75 +GROUPBYDAY="yes" +INCLUDEREV="no" +CHANGELOG="ChangeLog" + +# do command line checking +prog=`basename $0` +while [ -n "$1" ] +do + case "$1" in + --strip-prefix) + STRIPPREFIX="$2" + shift 2 + ;; + --linelen) + LINELEN="$2"; + shift 2 + ;; + --separate) + GROUPBYDAY="no"; + shift + ;; + -r|--include-rev) + INCLUDEREV="yes"; + shift + ;; + -O|--svn-options) + EXTRAOPTS="$2" + shift 2 + ;; + -o|--output) + CHANGELOG="$2" + shift 2 + ;; + --stdout) + CHANGELOG="-" + shift + ;; + -V|--version) + echo "$prog $VERSION"; + echo "Written by Arthur de Jong." + echo "Modified by Matti Hamalainen." + echo "Copyright (C) 2005-2008 Arthur de Jong." + echo "" + 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]..." + echo "Generate a ChangeLog from a checked out subversion repository." + echo "" + echo " --strip-prefix NAME prefix to strip from all entries, defaults" + echo " to the name of the current directory" + echo " --linelen NUM maximum length of an output line" + echo " --separate don't group changelog entries by day" + echo " -r, --include-rev include revision numbers" + echo " -o, --output FILE output to FILE instead of ChangeLog" + echo " --stdout output to stdout instead of ChangeLog" + echo " -O, --svn-options OPT options passed to Subversion" + echo " -h, --help display this help and exit" + echo " -V, --version output version information and exit" + exit 0 + ;; + *) + echo "$prog: invalid option -- $1" + echo "Try \`$prog --help' for more information." + exit 1 + ;; + esac +done + +# find the directory that this script resides in +prog="$0" +while test -h "$prog"; do + prog=`ls -ld "$prog" | sed "s/^.*-> \(.*\)/\1/;/^[^/]/s,^,$(dirname "$prog")/,"` +done +dir=`dirname $prog` +dir=`cd $dir && pwd` +XSL="$dir/svn2cl.xsl" + +# redirect stdout to the changelog file if needed +if test "x$CHANGELOG" != "x-"; then + exec > "$CHANGELOG" +fi + +# actually run the command we need +svn --verbose --xml log $SVNOPTS | \ + xsltproc --stringparam strip-prefix "$STRIPPREFIX" \ + --stringparam linelen $LINELEN \ + --stringparam groupbyday $GROUPBYDAY \ + --stringparam include-rev $INCLUDEREV \ + "$XSL" -
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/svn2cl.xsl Fri May 09 14:12:09 2008 +0300 @@ -0,0 +1,295 @@ +<?xml version="1.0" encoding="utf-8"?> + +<!-- + + svn2cl.xsl - xslt stylesheet for converting svn log to a normal + changelog + + Usage (replace ++ with two minus signs): + svn ++verbose ++xml log | \ + xsltproc ++stringparam strip-prefix `basename $(pwd)` \ + ++stringparam linelen 75 \ + ++stringparam groupbyday yes \ + ++stringparam include-rev yes \ + 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 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 page [ + <!ENTITY tab "	"> + <!ENTITY newl " "> + <!ENTITY space " "> +]> + +<!-- + TODO + - make external lookups of author names possible + - find a place for revision numbers + - mark deleted files as such + - combine paths + - make path formatting nicer +--> + +<xsl:stylesheet + version="1.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns="http://www.w3.org/1999/xhtml"> + + <xsl:output + method="text" + encoding="iso-8859-15" + 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 entries should be grouped by day --> + <xsl:param name="include-rev" select="'no'" /> + + <!-- add newlines at the end of the changelog --> + <xsl:template match="log"> + <xsl:apply-templates/> + <xsl:text>&newl;</xsl:text> + </xsl:template> + + <!-- format one entry from the log --> + <xsl:template match="logentry"> + <!-- 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:apply-templates select="../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:apply-templates select="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:apply-templates select="date" /> + <!-- two spaces --> + <xsl:text>&space;&space;</xsl:text> + <!-- author's name --> + <xsl:apply-templates select="author" /> + <!-- two newlines --> + <xsl:text>&newl;&newl;</xsl:text> + </xsl:if> + <!-- get paths string --> + <xsl:variable name="paths"> + <xsl:apply-templates select="paths" /> + </xsl:variable> + <!-- get revision number --> + <xsl:variable name="rev"> + <xsl:if test="$include-rev='yes'"> + <xsl:text>[r</xsl:text> + <xsl:value-of select="@revision"/> + <xsl:text>]&space;</xsl:text> + </xsl:if> + </xsl:variable> + <!-- first line is indented (other indents are done in wrap template) --> + <xsl:text>&tab;*&space;</xsl:text> + <!-- print the paths and message nicely wrapped --> + <xsl:call-template name="wrap"> + <xsl:with-param name="txt" select="concat($rev,$paths,normalize-space(msg))" /> + </xsl:call-template> + </xsl:template> + + <!-- format date --> + <xsl:template match="date"> + <xsl:variable name="date" select="normalize-space(.)" /> + <!-- output date part --> + <xsl:value-of select="substring($date,1,10)" /> + <!-- output time part --> + <xsl:if test="$groupbyday!='yes'"> + <xsl:text>&space;</xsl:text> + <xsl:value-of select="substring($date,12,5)" /> + </xsl:if> + </xsl:template> + + <!-- format author --> + <xsl:template match="author"> + <xsl:value-of select="normalize-space(.)" /> + </xsl:template> + + <!-- present a list of paths names --> + <xsl:template match="paths"> + <xsl:for-each select="path"> + <xsl:sort select="normalize-space(.)" data-type="text" /> + <!-- unless we are the first entry, add a comma --> + <xsl:if test="not(position()=1)"> + <xsl:text>,&space;</xsl:text> + </xsl:if> + <!-- print the path name --> + <xsl:apply-templates select="."/> + </xsl:for-each> + <!-- end the list with a colon --> + <xsl:text>:&space;</xsl:text> + </xsl:template> + + <!-- transform path to something printable --> + <xsl:template match="path"> + <!-- fetch the pathname --> + <xsl:variable name="p1" select="normalize-space(.)" /> + <!-- strip leading slash --> + <xsl:variable name="p2"> + <xsl:choose> + <xsl:when test="starts-with($p1,'/')"> + <xsl:value-of select="substring($p1,2)" /> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$p1" /> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + <!-- strip trailing slash from strip-prefix --> + <xsl:variable name="sp"> + <xsl:choose> + <xsl:when test="substring($strip-prefix,string-length($strip-prefix),1)='/'"> + <xsl:value-of select="substring($strip-prefix,1,string-length($strip-prefix)-1)" /> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$strip-prefix" /> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + <!-- strip strip-prefix --> + <xsl:variable name="p3"> + <xsl:choose> + <xsl:when test="starts-with($p2,$sp)"> + <xsl:value-of select="substring($p2,1+string-length($sp))" /> + </xsl:when> + <xsl:otherwise> + <!-- TODO: do not print strings that do not begin with strip-prefix --> + <xsl:value-of select="$p2" /> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + <!-- strip another slash --> + <xsl:variable name="p4"> + <xsl:choose> + <xsl:when test="starts-with($p3,'/')"> + <xsl:value-of select="substring($p3,2)" /> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$p3" /> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + <!-- translate empty string to dot --> + <xsl:choose> + <xsl:when test="$p4 = ''"> + <xsl:text>.</xsl:text> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$p4" /> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + + <!-- string-wrapping template --> + <xsl:template name="wrap"> + <xsl:param name="txt" /> + <xsl:choose> + <xsl:when test="(string-length($txt) < (($linelen)-9)) or not(contains($txt,' '))"> + <!-- this is easy, nothing to do --> + <xsl:value-of select="$txt" /> + <!-- add newline --> + <xsl:text>&newl;</xsl:text> + </xsl:when> + <xsl:otherwise> + <!-- find the first line --> + <xsl:variable name="tmp" select="substring($txt,1,(($linelen)-10))" /> + <xsl:variable name="line"> + <xsl:choose> + <xsl:when test="contains($tmp,' ')"> + <xsl:call-template name="find-line"> + <xsl:with-param name="txt" select="$tmp" /> + </xsl:call-template> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="substring-before($txt,' ')" /> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + <!-- print newline and tab --> + <xsl:value-of select="$line" /> + <xsl:text>&newl;&tab;&space;&space;</xsl:text> + <!-- wrap the rest of the text --> + <xsl:call-template name="wrap"> + <xsl:with-param name="txt" select="normalize-space(substring($txt,string-length($line)+1))" /> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + + <!-- template to trim line to contain space as last char --> + <xsl:template name="find-line"> + <xsl:param name="txt" /> + <xsl:choose> + <xsl:when test="substring($txt,string-length($txt),1) = ' '"> + <xsl:value-of select="normalize-space($txt)" /> + </xsl:when> + <xsl:otherwise> + <xsl:call-template name="find-line"> + <xsl:with-param name="txt" select="substring($txt,1,string-length($txt)-1)" /> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + +</xsl:stylesheet>