#!/bin/sh

# $PostgreSQL: pgsql/src/tools/pgcvslog,v 1.33 2007/01/31 22:17:03 momjian Exp $

# This utility is used to generate a compact list of changes
# for each release, bjm 2000-02-22

# Usage $0 file

# All branches:	
# cvs log -d'>1999-06-14 00:00:00 GMT' . > log
#
# HEAD:
# cvs log -d'>2000-05-29 00:00:00 GMT' -b .
#
# Branch:
# cvs log -d'>2000-05-29 00:00:00 GMT' -rREL8_0_STABLE .
#
# Date range
# cvs log -d'2005-05-08<2005-05-29' -rREL8_0_STABLE .
#
# To find branch time, look for "branches:" tag in CVS commit logs
# e.g. "branches:  1.398.4;" matches "REL8_0_STABLE: 1.398.0.4".
#
# Remove these from the log file before processing to reduce the number
# of unneeded log entries:
#
#	/cvsroot/pgsql/doc/TODO
#	/cvsroot/pgsql/doc/FAQ
#	/cvsroot/pgsql/doc/src/FAQ/TODO.html
#	/cvsroot/pgsql/doc/src/FAQ/FAQ.html
#

if [ "X$1" = "X-h" ]
then	HTML="Y"
	shift
else	HTML="N"
fi

cat "$@" |

# protect HTML input if in HTML mode
if [ "$HTML" = "Y" ]
then	sed 	-e 's/\&/\&amp;/g' \
		-e 's/</\&lt;/g' \
		-e 's/>/\&gt;/g' \
		-e 's/"/\&quot;/g'
else	cat
fi |

# mark each line with a datetime and line number, for sorting and merging
# We don't print anything from the -- or == line and the date:

awk '	BEGIN	{html="'"$HTML"'"; lineno = 0;}
	# store working directory
	$0 ~ /^Working file:/	{workingfile = "/" $3}

	# no need to show TODO or FAQ changes in the output
	$0 !~ /^====*$/ &&
	(workingfile == "/doc/TODO" || workingfile == "/doc/src/FAQ/TODO.html" ||
	 workingfile == "/doc/FAQ" || workingfile == "/doc/src/FAQ/FAQ.html") \
		{next}

	($0 ~ /^====*$/ || $0 ~ /^----*$/) \
	{
		# print blank line to separate entries
		if (datetime != "")
		{
 			if (html != "Y")
				printf ("%s| %10d|%s\n", datetime, lineno++, "");
			printf ("%s| %10d|", datetime, lineno++);
 			if (html != "Y")
				printf ("%s\n", "---");
			else	printf ("<HR>\n");
		}
		datetime="";
	}

	# if we have a saved datetime, print filename, date line, and committer
	datetime != "" && $1 != "branches:" {printf ("%s| %10d| %s\n", datetime, lineno++, $0);}

	$1 == "date:" \
	{
		# get entry date
		datetime=$2"-"$3
		if (workingfile != "")
		{
			printf ("%s| %10d|", datetime, lineno++);
			if (html != "Y")
				printf ("%s\n", workingfile);
			else	printf ("<SMALL><FONT COLOR=\"red\">%s</FONT></SMALL>\n", workingfile);

			# output name of committer
			# remove semicolon from committers name
			gsub("/", "-", $2);
			gsub(";", "", $3);
			gsub(";", "", $5);
			printf ("%s| %10d|", datetime, lineno++);
			if (html != "Y")
				printf ("%78s\n", $5);
			else	printf ("<DIV ALIGN=\"right\"><SMALL><FONT COLOR=\"teal\">%s</FONT> <FONT COLOR=\"green\">%s</FONT></SMALL></DIV>\n", $5, $2);
		}
	}

	/* clear working file */
	$0 ~ /^====*$/	{workingfile=""}' |

sort | cut -d'|' -f3 |

# collect duplicate narratives

awk '   BEGIN   { slot = 0; oldslot=0; save_working = ""; html="'"$HTML"'"}
	{
		# We have a filename, so we look at the previous
		# narrative to see if it is new narrative text.
		if ($0 ~ /^\// || $0 ~ />\//)
		{
			# If there are a different number of narrative
			# lines, they can not possibly be the same.
			if (slot != oldslot)
				same = "N";
			else
			{
				same = "Y";
				for (i=1; i <= slot; i++)
				{
					if (oldnarr[i] != narr[i])
					{
						same = "N";
						break;
					}
				}
			}

			# dump out the old narrative if it is new
			if (same == "N")
			{
				if (oldslot)
					for (i=1; i <= oldslot; i++)
					{
						print oldnarr[i];
						if (html == "Y" && 
						    oldnarr[i] != "<HR>" &&
						    oldnarr[i] !~ "^<DIV ")
							print "<BR>";
					}

				# save the current narrative
				for (i=1; i <= slot; i++)
					oldnarr[i] = narr[i];
				oldslot = slot;
			}
			slot = 0;

			# dump out the previous filename
			print save_working;
			if (html == "Y")
				print "<BR>";

			# store the current filename for later printing
			save_working = $0;
		}
		else
		# we have a narrative line
		{
			# accumulate narrative
			narr[++slot] = $0;
		}
	}
	END	{
			# If there are a different number of narrative
			# lines, they can not possibly be the same.
			if (slot != oldslot)
				same = "N";
			else
			{
				same = "Y";
				for (i=1; i <= slot; i++)
				{
					if (oldnarr[i] != narr[i])
					{
						same = "N";
						break;
					}
				}
			}

			# dump out the old narrative if it is new
			if (same == "N")
			{
				if (oldslot)
					for (i=1; i <= oldslot; i++)
					{
						print oldnarr[i];
						if (html == "Y" && 
						    oldnarr[i] != "<HR>" &&
						    oldnarr[i] !~ "^<DIV ")
							print "<BR>";
					}
			}

			# dump out the last filename
			print save_working;

			if (html == "Y")
				print "<BR>";

			# dump out the last narrative
			for (i=1; i <= slot; i++)
			{
				print narr[i];
				if (html == "Y" && 
				    narr[i] != "<HR>" &&
				    narr[i] !~ "^<DIV ")
					print "<BR>";
			}
		}' |

# add HTML wrapper
if [ "$HTML" = "Y" ]
then	echo "<HTML>"
	echo "<HEAD>"
	echo "<TITLE>CVS</TITLE>"
	echo "</HEAD>"
	echo "<BODY>"
	cat
	echo "</BODY>"
	echo "</HTML>"
else	cat
fi
