#! /usr/bin/tcl

set project [lindex $argv 0]
set fmtstr [lindex $argv 1]

if {$project == ""} {
	puts stderr "Usage: build_changelog <project>"
	exit 1
}
if {$fmtstr == ""} {
	set fmtstr "%a, %e %b %Y"
}

if {[catch {
	cd /home/rkeene/devel/$project
} err]} {
	puts $err
	exit 1
}

set scanmode 0
foreach line [split [exec svn log -v] \n] {
	if {[string match {---------------*------------} $line]} {
		continue
	}

	if {[string match {r* | * | *-*-* *:*:* (*) | * line*} $line]} {
		set wrk [split $line |]
		set rev [string trim [lindex $wrk 0]]
		set date [clock scan [string trim [lindex $wrk 2]]]

		set release([list $rev $date]) ""
		continue
	}

	if {$line == "Changed paths:"} {
		set scanmode 1
		continue
	}

	if {$scanmode && $line == ""} {
		set scanmode 0
		continue
	}

	if {$scanmode} {
		set wrk [split [string trim $line]]
		set modfile [join [lrange $wrk 1 end]]
		if {![string match "/devel/$project*" $modfile]} {
			set invalid_release([list $rev $date]) 1
		}
		continue
	}

	lappend release([list $rev $date]) $line
}

foreach relinfo [array names release] {
	set maxele -1
	for {set i 0} {$i < [llength $release($relinfo)]} {incr i} {
		if {[lindex $release($relinfo) $i] != ""} {
			set maxele $i
		}
	}

	set release($relinfo) [lrange $release($relinfo) 0 $maxele]
}

set dates ""
foreach relinfo [lsort -decreasing -dictionary [array names release]] {
	if {[info exists invalid_release($relinfo)]} {
		continue
	}

	set rev [lindex $relinfo 0]
	set date [lindex $relinfo 1]

	set datefmt "[clock format $date -format $fmtstr]"
	lappend dates $datefmt
	foreach line $release($relinfo) {
		lappend reldatesinfo($datefmt) $line
	}
	lappend reldatesinfo($datefmt) ""
}

foreach relinfo [lsort -decreasing -dictionary [array names release]] {
	set rev [lindex $relinfo 0]
	set date [lindex $relinfo 1]
	set datefmt "[clock format $date -format $fmtstr]"

	if {![info exists reldatesinfo($datefmt)]} {
		continue
	}

	puts "$datefmt"
	foreach line [lrange $reldatesinfo($datefmt) 0 end-1] {
		puts "   * $line"
	}
	unset reldatesinfo($datefmt)
	puts ""
}
