#!/bin/sh
set -e
set -u
VERSION="0.11"
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=""
AWK="awk"
prog=`basename $0`
while [ $do
case "$1" in
--strip-prefix)
STRIPPREFIX="$2"
shift 2 || { echo "$prog: option requires an argument -- $1";exit 1; }
;;
--strip-prefix=*)
STRIPPREFIX=`echo "$1" | sed 's/^--[a-z-]*=//'`
shift
;;
--linelen)
LINELEN="$2";
shift 2 || { echo "$prog: option requires an argument -- $1";exit 1; }
;;
--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)
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 || { echo "$prog: option requires an argument -- $1";exit 1; }
;;
--title=*)
TITLE=`echo "$1" | sed 's/^--[a-z-]*=//'`
shift
;;
--revision-link)
REVISION_LINK="$2"
shift 2 || { echo "$prog: option requires an argument -- $1";exit 1; }
;;
--revision-link=*)
REVISION_LINK=`echo "$1" | sed 's/^--[a-z-]*=//'`
shift
;;
--ignore-message-starting)
IGNORE_MESSAGE_STARTING="$2"
shift 2 || { echo "$prog: option requires an argument -- $1";exit 1; }
;;
--ignore-message-starting=*)
IGNORE_MESSAGE_STARTING=`echo "$1" | sed 's/^--[a-z-]*=//'`
shift
;;
-f|--file|-o|--output)
CHANGELOG="$2"
shift 2 || { echo "$prog: option requires an argument -- $1";exit 1; }
;;
--file=*|--output=*)
CHANGELOG=`echo "$1" | sed 's/^--[a-z-]*=//'`
shift
;;
--stdout)
CHANGELOG="-"
shift
;;
--authors)
AUTHORSFILE="$2"
shift 2 || { echo "$prog: option requires an argument -- $1";exit 1; }
;;
--authors=*)
AUTHORSFILE=`echo "$1" | sed 's/^--[a-z-]*=//'`
shift
;;
--html)
OUTSTYLE="html"
shift
;;
-r|--revision|--targets|--limit)
arg=`echo "$2" | sed "s/'/'\"'\"'/g"`
SVNLOGCMD="$SVNLOGCMD $1 '$arg'"
shift 2 || { echo "$prog: option requires an argument -- $1";exit 1; }
;;
--username|--password|--config-dir)
arg=`echo "$2" | sed "s/'/'\"'\"'/g"`
SVNLOGCMD="$SVNLOGCMD $1 '$arg'"
SVNINFOCMD="$SVNINFOCMD $1 '$arg'"
shift 2 || { echo "$prog: option requires an argument -- $1";exit 1; }
;;
--revision=*|--targets=*|--limit=*)
arg=`echo "$1" | sed "s/'/'\"'\"'/g"`
SVNLOGCMD="$SVNLOGCMD '$arg'"
shift
;;
--username=*|--password=*|--config-dir=*)
arg=`echo "$1" | sed "s/'/'\"'\"'/g"`
SVNLOGCMD="$SVNLOGCMD '$arg'"
SVNINFOCMD="$SVNINFOCMD '$arg'"
shift
;;
--stop-on-copy)
SVNLOGCMD="$SVNLOGCMD $1"
shift
;;
--no-auth-cache|--non-interactive)
SVNLOGCMD="$SVNLOGCMD $1"
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
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${OUTSTYLE}.xsl"
if [ -n "$AUTHORSFILE" ] && \
egrep '^(then
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'"
echo '<authors>' > "$tmpfile"
sed -n 's/&/\&/g;s/</\</g;s/>/\>/g;s|^\([a-zA-Z0-9][^:]*\):\(.*\)$| <author uid="\1">\2</author>|p' \
< "$AUTHORSFILE" >> "$tmpfile"
echo '</authors>' >> "$tmpfile"
AUTHORSFILE="$tmpfile"
fi
pwd=`pwd`
AUTHORSFILE=`echo "$AUTHORSFILE" | sed "/^[^/]/s|^|$pwd/|"`
if [ -z "$CHANGELOG" ]
then
CHANGELOG="ChangeLog"
if [ "$OUTSTYLE" != "cl" ]
then
CHANGELOG="$CHANGELOG.$OUTSTYLE"
fi
fi
if [ "$STRIPPREFIX" = "AUTOMATICALLY-DETERMINED" ]
then
STRIPPREFIX=`LANG=C eval "$SVNINFOCMD" 2> /dev/null | $AWK '/^URL:/{url=$2} /^Repository Root:/{root=$3} END{if(root){print substr(url,length(root)+2)}else{n=split(url,u,"/");print u[n]}}'`
STRIPPREFIX=`echo "$STRIPPREFIX" | sed 's/%20/ /g'`
fi
if [ "x$CHANGELOG" != "x-" ]
then
exec > "$CHANGELOG"
fi
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" -
[ -n "$TMPFILES" ] && eval "rm -f $TMPFILES"
exit 0