#!/bin/bash

SVNPATH="/home/h/uppsvn"
COUNT="25"
HTMLOUTPUT="/tmp/svnchanges.html"
RSSOUTPUT="/tmp/svnchanges.xml"

search='r\([0-9]*\)[ |]*\([^|]*\)[ |]*[0-9\-]* \([0-9: +\-]*\) (\(.*\)).*\nChanged paths:\n\(.*\)\n\n\(.*\)$'

replace_html='	<table style="font-size:small;">\
		<tr><td>Revision:<\/td><td><b><a href="http:\/\/code.google.com\/p\/upp-mirror\/source\/detail?r=\1">\1<\/a><\/b><\/td><\/tr>\
		<tr><td>Description:<\/td><td><code>\6<\/code><\/td><\/tr>\
		<tr><td>Submitted:<\/td><td><i>\4 \3<\/i> by <i>\2<\/i><\/td><\/tr>\
		<tr><td colspan="2">\
			<a href="" id="a\1" onclick="toggleFiles(\1);return false;">Show affected files<\/a>\
			<div id="f\1" style="display:none;margin-left:20px;">\
\5\
			<\/div>\
		<\/td><\/tr>\
	<\/table><br>'

replace_rss='<item>\
<title>Revision \1<\/title>\
<link>http:\/\/code.google.com\/p\/upp-mirror\/source\/detail?r=\1<\/link>\
<guid>http:\/\/code.google.com\/p\/upp-mirror\/source\/detail?r=\1<\/guid>\
<pubDate>\4 \3<\/pubDate>\
<description><![CDATA[\
	<table style="font-size:small;">\
		<tr><td>Revision:<\/td><td><b>\1<\/b><\/td><\/tr>\
		<tr><td>Description:<\/td><td><code>\6<\/code><\/td><\/tr>\
		<tr><td>Submitted:<\/td><td><i>\4 \3<\/i> by <i>\2<\/i><\/td><\/tr>\
		<tr><td colspan="2">\
			Affected files:\
			<div style="margin-left:20px;">\
\5\
			<\/div>\
		<\/td><\/tr>\
	<\/table>\
]]><\/description>\
<\/item>'

export LC_ALL="C"

svn --limit $COUNT --verbose log $SVNPATH |\
sed -n \
-e "1 d" \
-e '/-----*/ !{ # when the line IS NOT separator
	s/</\&lt;/
	s/>/\&gt;/ # encode entities
	s/&/\&amp;/
	s/^ *A \(.*$\)/				<a href="http:\/\/code.google.com\/p\/upp-mirror\/source\/browse\1">\1<\/a> (<a href="http:\/\/code.google.com\/p\/upp-mirror\/source\/diff?spec=svnX_RELEASE_X\&amp;r=X_RELEASE_X\&amp;format=side\&amp;path=\1">Added<\/a>)<br>/
	s/^ *M \(.*$\)/				<a href="http:\/\/code.google.com\/p\/upp-mirror\/source\/browse\1">\1<\/a> (<a href="http:\/\/code.google.com\/p\/upp-mirror\/source\/diff?spec=svnX_RELEASE_X\&amp;r=X_RELEASE_X\&amp;format=side\&amp;path=\1">Modified<\/a>)<br>/
	s/^ *D \(.*$\)/				<a href="http:\/\/code.google.com\/p\/upp-mirror\/source\/browse\1">\1<\/a> (<a href="http:\/\/code.google.com\/p\/upp-mirror\/source\/diff?spec=svnX_RELEASE_X\&amp;r=X_RELEASE_X\&amp;format=side\&amp;path=\1">Removed<\/a>)<br>/
	H #append everything between separators into hold space
}' \
-e "/-----*/ { # when the line IS separator
	g # get string from hold space
	s/$search/$replace_html/
	:label1
	s/\"f\([0-9]*\)\"\(.*\)X_RELEASE_X/\"f\1\"\2\1/
	t label1
	w $HTMLOUTPUT.tmp
	g
	s/$search/$replace_rss/
	:label2
	s/r=\([0-9]*\)<\(.*\)X_RELEASE_X/r=\1<\2\1/
	t label2
	w $RSSOUTPUT.tmp
	s/.*//
	x
}"

cat > $HTMLOUTPUT <<EOF
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
	<title>Ultimate++ framework latest svn changes</title>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	<script type="text/javascript">
function toggleFiles(id){
	var f=document.getElementById("f"+id);var a=document.getElementById("a"+id);
	if(f.style.display=="none"){f.style.display="block";a.innerHTML="Hide affected files";}
	else{f.style.display="none";a.innerHTML="Show affected files"}}
	</script>
</head>
<body>
EOF
cat $HTMLOUTPUT.tmp >> $HTMLOUTPUT
cat >> $HTMLOUTPUT <<EOF
</body>
</html>
EOF

cat > $RSSOUTPUT <<EOF
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
	<title>Ultimate++ svn changes</title>
	<link>http://ultimatepp.org/</link>
	<description>This script offers up-to-date list of commits to Ultimate++ framework svn</description>
	<lastBuildDate>`date -R`</lastBuildDate>
	<language>en-us</language>
	<atom:link href="http://koncept.nazory.cz/svnchanges.xml" rel="self" type="application/rss+xml" />
EOF
cat $RSSOUTPUT.tmp >> $RSSOUTPUT
cat >> $RSSOUTPUT <<EOF
</channel>
</rss>
EOF

rm $HTMLOUTPUT.tmp
rm $RSSOUTPUT.tmp
