#!/bin/sh
# -*- mode: tcl -*- \
exec /ldcg/bin/tclsh "$0" ${1+"$@"}

proc Test_AddDetailedRecord { dir state subtest } {
    global Tests
    global SymbolicTestName

    if [ info exists Tests($dir,detailed,$SymbolicTestName) ] {
	set Tests($dir,detailed,$SymbolicTestName) \
	    [ lappend Tests($dir,detailed,$SymbolicTestName) $state $subtest ]
    } else {
	set Tests($dir,detailed,$SymbolicTestName) [ list $state $subtest ]
    }
}

proc Test_AddOverviewRecord { dir state test_name } {
    global Tests
    global TestDirs
    global SymbolicTestName
    global SymbolicTestNames

    set Tests($dir,overview,$SymbolicTestName) $state
    if [ info exists TestDirs($dir,tests) ] {
	set TestDirs($dir,tests) [ lappend TestDirs($dir,tests) $test_name ]
    } else {
	set TestDirs($dir,tests) [ list $test_name ]
    }
    set SymbolicTestNames($SymbolicTestName) $test_name
    set SymbolicTestNames($dir\:\:$test_name) $SymbolicTestName
    NextSymbolicTestName
}

proc Test_AddTestDirRecord { dir failed number } {
    global DirIndex
    global TestDirs
    global PkgTests
    global pkg
    
    set DirIndex [ lappend DirIndex $dir ]
    set TestDirs($dir,failed) $failed
    set TestDirs($dir,total) $number
    if [ info exists PkgTests($pkg,total) ] {
	set PkgTests($pkg,total) [ expr $PkgTests($pkg,total) + $number ]
    } else {
	set PkgTests($pkg,total) $number
    }
    if [ info exists PkgTests($pkg,failed) ] {
	set PkgTests($pkg,failed) [ expr $PkgTests($pkg,failed) + $failed ]
    } else {
	set PkgTests($pkg,failed) $failed
    }
}

proc NextSymbolicTestName { } {
    global SymbolicTestName
    global SymbolicTestNameCounter

    set SymbolicTestNameCounter [ expr $SymbolicTestNameCounter + 1 ]
    set SymbolicTestName "__symbolic_test_$SymbolicTestNameCounter"
}

#------------------------------------------------------------------------
# Establish global variables
#------------------------------------------------------------------------

for {set idx 0} {$idx < $::argc} {incr idx} {
    set opt [lindex $::argv $idx]
    set value ""
    regexp {^(--?[^=]+)=(.*)$} $opt match opt value
    switch -glob -- $opt {
	--version {
	    if { [string length $value] <= 0 } {
		set LdasVersion [lindex $::argv[ incr idx]]
	    } else {
		set LdasVersion $value
	    }
	} ;# --version
    } ;# switch
} ;# for

if { ! [info exists LdasVersion] } {
    set LdasVersionDir ""
} else {
    set LdasVersionDir "-$LdasVersion"
}
set BuildLogDir "/usr1/lcldsk/emaros/build/ldas${LdasVersionDir}/$tcl_platform(os)-$tcl_platform(machine)/build_logs"
set LogFile "$BuildLogDir/make_distcheck-ldas"
set OutputDir "/ldas_outgoing/nightly_testing/$tcl_platform(os)-$tcl_platform(machine)/"
set LdasConfigHH [file join $BuildLogDir .. include ldas ldasconfig.hh]


set SymbolicTestNameCounter 0
set SymbolicTestName ""
set DirIndex [ list ]

set DetailedNumber 0

NextSymbolicTestName

#------------------------------------------------------------------------
# Create the directory to hold the information
#------------------------------------------------------------------------

if { ! [info exists LdasVersion] } {
    set fid [ open "$BuildLogDir/../../configure.in" r ]
    set data [ read $fid [ file size "$BuildLogDir/../../configure.in" ] ]
    close $fid

    regexp {AC_INIT\(.*,(\d+\.\d+\.\d+),.*\)} $data match LdasVersion
}
set OutputDir "$OutputDir/$LdasVersion"

file mkdir $OutputDir

set Packages {
    ldas
    datacond
    diskcache
    framecpp
    wrapper
}

array set PackageInfo [ subst {
    ldas::total 137
    datacond::total 119
    diskcache::total 21
    framecpp::total 16
    wrapper::total 23 } ]

set BuildDate "<font color=\"red\">Unknown</font>"
if { [ file exists $LdasConfigHH ] } {
    set configfd [ open $LdasConfigHH r ]
    while {[gets $configfd line] >= 0} {
	if [regexp -- {^[[:space:]]*#define[[:space:]]+([^[:space:]]*)[[:space:]]+(.*)$} $line match var val] {
	    #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
	    # Remove quotation marks from value
	    #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
	    regexp -- {^\"(.*)\"$} $val match val
	    switch -exact $var {
		LDAS_BUILD_DATE {
		    #::::::::::::::::::::::::::::::::::::::::::::::::::::
		    # Record the timestamp of the build
		    #::::::::::::::::::::::::::::::::::::::::::::::::::::
		    set BuildDate $val
		}
	    }
	}
    }
    close $configfd
}

#------------------------------------------------------------------------
# Parse the distcheck log for status of make check
#------------------------------------------------------------------------

set f [ open $LogFile r ]
set dir ""
set pkg ""
while {[gets $f line] >= 0} {
    if [regexp {^(\d+) of (\d+) tests failed$} $line match failed total] {
	Test_AddTestDirRecord $dir $failed $total
    } elseif [regexp {^All (\d+) tests passed$} $line match total] {
	Test_AddTestDirRecord $dir 0 $total
    } elseif [regexp {^.* Entering directory \`.*/([^/]+)/=build/(.*)\'$} $line match pkg direntry] {
	set dir "$pkg\:\:$direntry"
    } elseif [regexp {^(PASS|FAIL): (.*)$} $line match state test] {
	Test_AddOverviewRecord $dir $state $test
    } elseif [regexp {^-- (PASS|FAIL): (.*)$} $line match state subtest] {
	Test_AddDetailedRecord $dir $state $subtest
    }
}
close $f
#------------------------------------------------------------------------
# Generation of HTML files
#------------------------------------------------------------------------
# 
#------------------------------------------------------------------------
set overview [ open "$OutputDir/Overview.html" w ]
puts $overview "<title>Overview $LdasVersion</title>"
puts $overview "<table>"
puts $overview "<tr><td><B>Platform</B>:<td>$tcl_platform(platform)"
puts $overview "<tr><td><B>OS</B>:<td>$tcl_platform(os)"
puts $overview "<tr><td><B>OSVersion</B>:<td>$tcl_platform(osVersion)"
switch -exact -- $tcl_platform(os) {
    Linux {
	if [file exists /etc/redhat-release] {
	    set rfd [ open "/etc/redhat-release" "r" ]
	    gets $rfd release
	    puts $overview " ($release)"
	    close $rfd
	}
    }
    SunOS {
	puts $overview " ([exec uname -v])"
    }
}

puts $overview "<tr><td><B>Machine</B>:<td>$tcl_platform(machine)"
puts $overview "<tr><td><B>Byte Order</B>:<td>$tcl_platform(byteOrder)"
if [ info exists tcl_platform(wordSize) ] {
    puts $overview "<tr><td><B>Word Size</B>:<td>$tcl_platform(wordSize)"
}
puts $overview "<tr><td><b>Build Date</b>:</td><td>$BuildDate</td>"
puts $overview "</table>"
#------------------------------------------------------------------------
# Put out a summary report of all expected packages.
#------------------------------------------------------------------------
set pass 1
puts $overview "<H2>Summary Information</H2>"
puts $overview "<table border=\"2\">"
puts $overview "<tr><th>Package</th><th>Failures</th><th>Total Number of Tests</th></tr>"
set tfail 0
set ttests 0
set expected_number_of_tests 1
foreach pkgname [ lsort -ascii -increasing $Packages ] {
    set pkg "$pkgname-$LdasVersion"
    #--------------------------------------------------------------------
    # Assume that the package did not build
    #--------------------------------------------------------------------
    set href "<b><font color=\"red\">$pkg</font></b>"
    if { ! [info exists PkgTests($pkg,failed) ] } {
	incr tfail $PackageInfo(${pkgname}::total)
	set failed "<b><font color=\"red\">Missing</font></b>"
	set pass 0
    } else {
	incr tfail $PkgTests($pkg,failed)
	if { $PkgTests($pkg,failed) > 0 } {
	    set failed "<b><font color=\"red\">$PkgTests($pkg,failed)</font></b>"
	    set pass 0
	} else {
	    set failed "<font color=\"green\">$PkgTests($pkg,failed)</font>"
	}
	#----------------------------------------------------------------
	# The package did build so generate a link to the checks
	#----------------------------------------------------------------
	set href "<a href=\"#$pkg\">$pkg</href>"
    }
    if { ! [info exists PkgTests($pkg,total) ] } {
	set total "<b><font color=\"red\">$PackageInfo(${pkgname}::total)</font></b>"
	incr ttests $PackageInfo(${pkgname}::total)
	set expected_number_of_tests 0
	set pass 0
    } else {
	incr ttests $PkgTests($pkg,total)
	if { $PkgTests($pkg,total) == $PackageInfo(${pkgname}::total) } {
	    set total "<font color=\"green\">$PkgTests($pkg,total)</font>"
	} else {
	    set pass 0
	    set total "<font color=\"red\">$PkgTests($pkg,total)</font>"
	    set total "$total of <font color=\"red\">$PackageInfo(${pkgname}::total)</font>"
	    set expected_number_of_tests 0
	}
    }
    puts $overview "<tr><td>$href</td><td>$failed</td><td>$total<td></tr>"
}
if { $tfail } {
    set tfail "<font color=\"red\">$tfail</font>"
    set pass 0
} else {
    set tfail "<font color=\"green\">$tfail</font>"
}
if { $expected_number_of_tests } {
    set ttests "<font color=\"green\">$ttests</font>"
} else {
    set ttests "<font color=\"red\">$ttests</font>"
    set pass 0
}
puts $overview "<tr><td>TOTALS</td><td>$tfail</td><td>$ttests</td></tr>"
puts $overview "</table>"
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# Record the status for others.
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set statusfd [ open "$OutputDir/OverviewStatus.html" w ]
if { $pass } {
    puts $statusfd "<font color=\"green\">PASS</font>"
} else {
    puts $statusfd "<font color=\"red\">FAIL</font>"
}
close $statusfd
#------------------------------------------------------------------------
# Give detailed information
#------------------------------------------------------------------------
puts $overview "<p>"
foreach pkgdir $DirIndex {
    regexp {^(.*)::(.*)$} $pkgdir match pkg dir
    #--------------------------------------------------------------------
    # Put in information that is needed for each sub-package
    #--------------------------------------------------------------------
    if [ info exists cpkg ] {
	if { $cpkg != $pkg } {
	    if [ info exists cdir ] {
		puts $overview "</ul>\n" ;# Directory - end
	    }
	    set cpkg $pkg
	    puts $overview "<a class=\"anchor\" name=\"$cpkg\"></a>"
	    puts $overview "<H2>$cpkg - Summary: $PkgTests($cpkg,failed) of $PkgTests($cpkg,total) failed</H2>"
	    if [ info exists cdir ] {
		unset cdir
	    }
	}
    } else {
	if [ info exists cdir ] {
	    puts $overview "</ul>\n" ;# Directory - end
	}
	set cpkg $pkg
	puts $overview "<a class=\"anchor\" name=\"$cpkg\"></a>"
	puts $overview "<H2>$cpkg - Summary: $PkgTests($cpkg,failed) of $PkgTests($cpkg,total) failed</H2>"
	if [ info exists cdir ] {
	    unset -nocomplain cdir
	}
    }
    #--------------------------------------------------------------------
    # Put in information that is needed for each test directory
    #--------------------------------------------------------------------
    if [ info exists cdir ] {
	puts $overview "</ul><ul>" ;# Directory
    } else {
	puts $overview "<ul>"	;# Directory
    }
    set cdir $dir
    puts -nonewline $overview "<li><H3>"
    if { $TestDirs($pkgdir,failed) > 0 } {
	puts -nonewline $overview "<font color=red>$cdir</font>"
    } else {
	puts -nonewline $overview "$cdir"
    }
    puts $overview " -- $TestDirs($pkgdir,failed) of $TestDirs($pkgdir,total) failed</H3>"
    puts $overview "<ul>" ;# Test
    foreach test $TestDirs($pkgdir,tests) {
	#----------------------------------------------------------------
	# Put in information that is needed for each test directory
	#----------------------------------------------------------------
	set symbolic_name $SymbolicTestNames($pkgdir\:\:$test)
	set state [ lindex $Tests($pkgdir,overview,$symbolic_name) 0 ]
	set fail 0
	switch -exact -- $state {
	    PASS {
		set color green
	    }
	    FAIL {
		set color red
		set fail 1
	    }
	    default {
		set color yellow
		set fail 1
	    }
	}
	puts -nonewline $overview "<li><B><font color=$color>$state</font></B>"
	set DetailedNumber [ expr $DetailedNumber + 1 ]
	set DetailedFilename "Detailed_$DetailedNumber.html"
	set DetailFailedFilename "Detailed_FAILED_$DetailedNumber.html"
	if [ info exists Tests($pkgdir,detailed,$symbolic_name) ] {
	    set msg "- <a href=\"$DetailedFilename\">$test</a>"
	} else {
	    set msg "- $test"
	}
	if { $fail } {
	    set msg "$msg - <a href=\"$DetailFailedFilename\">Failures only</a>"
	}
	puts $overview $msg
	#----------------------------------------------------------------
	# Create detailed description
	#----------------------------------------------------------------
	if [ info exists Tests($pkgdir,detailed,$symbolic_name) ] {
	    set detailed [ open "$OutputDir/$DetailedFilename" "w" ]
	    if { $fail } {
		set detail_failed_fd \
		    [ open "$OutputDir/$DetailFailedFilename" "w" ]
	    }
	    foreach { state subtest } $Tests($pkgdir,detailed,$symbolic_name) {
		set detail_failed 0
		switch -exact -- $state {
		    PASS {
			set color green
		    }
		    FAIL {
			set color red
			set detail_failed 1
		    }
		    default {
			set color yellow
			set detail_failed 1
		    }
		}
		set msg "<li><B><font color=$color>$state</font></B> - $subtest"
		puts $detailed $msg
		if { $detail_failed } {
		    puts $detail_failed_fd $msg
		}
	    }
	    close $detailed
	    if { $fail } {
		close $detail_failed_fd
	    }
	}
    }
    puts $overview "</ul>" ;# Test - end
}
if [ info exists cdir ] {
    puts $overview "</ul>\n" ;# Directory - end
}
close $overview
