#!/usr/bin/env perl

use Text::Wrap;

sub read_file {
	my($buffer);
	my($file) = shift;
	local($/) = undef;
	$buffer = <$file>;
	return($buffer);
}

sub edit_change_log() {
	my $file = $ARGV[0];
	open my $f, '<', $file or die ("Failed to open file: $file\n");
	my $logmsg = read_file ($f);

	# We do a bunch of munging on the log message here,
	# particularly for logs that are formatted in a ChangeLog
	# style.

	my $origlog = $logmsg;

	close ($f);
	
	# print "original: $logmsg\n";

	# Kill initial date/name stamp: YYYY-MM-DD First Last <email@example.com>

	$logmsg =~ s|^\s*\d\d*-\d\d*-\d\d*\s*[^<\n]*<[^>\n]*>\s*$|* \n|mg;

	# Strip out nickle version numbers
	$logmsg =~ s|^(version )?2.\d\d*$||mg;

	# Remove initial space for each line
	$logmsg =~ s|^[ \t]+||mg;

	# Collapse space sequences
	$logmsg =~ s|[ \t]+| |g;

	# Un-fold paragraphs
	$logmsg =~ s|([^\n])\n([^0-9*+\-\n])|$1 $2|g;

	my @lines = split (/\n/, $logmsg);
	
	$logmsg = "";

	my $reviews = "";

	foreach my $line (@lines) {
		# find lines begining with '*'
		if ($line =~ /^reviewed by:\s*/) {
			if ($line !~ /<delete if not using/) {
				$reviews = $reviews . "\n" . $line;
			}
		} else { 
			if ($line =~ s/^\*\s\s*//) {
				# strip off filename
				$line =~ s/^[^:]*:\s*//;
				# strip off function names
				while ($line =~ s/^\([^)]*\)[,:]*\s*// ) {
				}
			}
			# Remove initial space for each line
			$line =~ s|^[ \t+]+||;
			
			# Collapse space sequences
			$line =~ s|[ \t]+| |g;

			#
			# re line-wrap
			#
			$line = Text::Wrap::wrap ("", "    ", $line);
			
			$logmsg = $logmsg . $line . "\n";
		}
	}
	$logmsg = $logmsg . $reviews;

	# Trim initial newlines
	$logmsg =~ s|^\n+||;

	# collapse sequences of newlines
	$logmsg =~ s/\n\n*/\n/g;

	# Remove trailing whitespace
	$logmsg =~ s/[\s\n]+\z//;

	if (@skipped) {
	    $logmsg .= "\n\n\nSKIPPED:\n\t";
	    $logmsg .= join("\n\t", @skipped) . "\n";
	}

	open my $f, '>', $file or die ("Failed to open file: $file\n");
	
	print $f "$logmsg\n";
	close ($f)
}

edit_change_log ()
