@@ -1,125 +1,213 @@ -#! /bin/bash - -WEBDIR="/web/rkeene/devel/kitcreator/kitbuild" -export WEBDIR - -if [ ! -d "kits" ]; then - echo 'Could not find kits/ directory, aborting.' >&2 - - exit 1 -fi - -rm -rf "${WEBDIR}" -mkdir -p "${WEBDIR}" || exit 1 - -cp -r kits/* "${WEBDIR}" - -ln -s ../index.ttml "${WEBDIR}/" >/dev/null 2>/dev/null - -totaltests_count="$(ls -1 tests/*.tcl | wc -l)" - -for file in "${WEBDIR}"/*; do - if [ -d "${file}" ]; then - continue - fi - - if echo "${file}" | egrep '\.(log|desc|ttml)$' >/dev/null; then - continue - fi - - # Find out which tests failed - failedtests_count="0" - failedtests="" - for faillog in "${file}"-[0-9][0-9]-*.log; do - if [ ! -f "${faillog}" ]; then - continue - fi - - failedtests_count=$[${failedtests} + 1] - failedtests="${failedtests} $(basename "${faillog}")" - done - - # Generate description - descfile="${file}.desc" - shortfile="$(basename "${file}")" - desc="" - - tclversion="$(echo "${shortfile}" | cut -f 2 -d -)" - parts="$(echo "${shortfile}" | cut -f 3- -d -)" - - while [ "${parts}" != "" ]; do - case "${parts}-" in - normal-*) - true - ;; - arm-*) - desc="${desc} on the CPU architecture MIPSEL/uClibc" - ;; - win32-*) - desc="${desc} for Microsoft Windows" - ;; - threaded-*) - desc="${desc} with threads support" - ;; - min-*) - desc="${desc} compiled minimally" - ;; - static-*) - desc="${desc} and statically" - ;; - notk-*) - if echo "${desc}" | grep -i support >/dev/null; then - desc="${desc} and" - fi - desc="${desc} without Tk" - ;; - statictk-*) - if echo "${desc}" | grep -i support >/dev/null; then - desc="${desc} and" - fi - desc="${desc} with Tk linked directly to the kit" - ;; - zip-*) - desc="${desc} using ZIP for Kit storage" - ;; - *) - echo "Unknown part (\"${parts}\"), skipping \"${shortfile}\"" >&2 - break - ;; - esac - - newparts="$(echo "${parts}" | cut -f 2- -d -)" - if [ "${newparts}" = "${parts}" ]; then - parts="" - else - parts="${newparts}" - fi - done - - if [ -z "${desc}" ]; then +#! /usr/bin/env tclsh + +package require Tcl 8.5 + +set WEBDIR "/web/rkeene/devel/kitcreator/kitbuild" +if {![file isdir "kits"]} { + puts stderr "Could not find kits/ directory, aborting." + + exit 1 +} + +set noncriticaltests [list "05-locale"] + +########################################################################## +## PROCEDURES ############################################################ +########################################################################## +proc pretty_print_key {key} { + set version [lindex $key 0] + set os [lindex $key 1] + set cpu [lindex $key 2] + + switch -glob -- $version { + "cvs_HEAD" { + set version "from CVS HEAD" + } + "cvs_*" { + set tag [join [lrange [split $version _] 1 end] _] + set version "from CVS tag $tag" + } + default { + set version "version $version" + } + } + + return "Tcl $version for [string totitle $os] on $cpu" +} + +proc pretty_print_buildinfo {buildinfo} { + set desc [list] + foreach tag [list min static notk statictk threaded zip] { + if {[lsearch -exact $buildinfo $tag] != -1} { + switch -- $tag { + "min" { + lappend desc "Minimally Built" + } + "static" { + lappend desc "Statically Linked" + } + "notk" { + lappend desc "Without Tk" + } + "statictk" { + lappend desc "Tk linked to Kit" + } + "threaded" { + lappend desc "Threaded" + } + "zip" { + lappend desc "Kit Filesystem in Zip" + } + } + } + } + + if {[llength $desc] == 0} { + return "Default Build" + } + + return [join $desc {, }] +} + +proc pretty_print_size {size} { + foreach unit [list "" K M G T P] { + if {$size < 1024} { + return "$size [string trim ${unit}B]" + } + + set size [expr {${size} / 1024}] + } +} + +########################################################################## +## MAIN BODY ############################################################# +########################################################################## + +file delete -force -- $WEBDIR +file mkdir $WEBDIR + +set fd [open [file join $WEBDIR index.html] w] + +file copy -force -- {*}[glob kits/*] $WEBDIR + +set totaltests_count [llength [glob tests/*.tcl]] + +foreach file [lsort -dictionary [glob -directory $WEBDIR *]] { + if {[file isdirectory $file]} { continue - fi + } + + switch -glob -- $file { + "*.log" - "*.ttml" - "*.html" - "*.desc" { + continue + } + } + + # Derive what we can from the filename + set shortfile [file tail $file] + set buildfile "${shortfile}-build.log" + set failedtests [glob -nocomplain -tails -directory $WEBDIR "${shortfile}-\[0-9\]\[0-9\]-*.log"] + + ## Split the filename into parts and store each part + set kitbuildinfo [split $shortfile -] + set tclversion [lindex $kitbuildinfo 1] + set kitbuildinfo [lsort -dictionary [lrange $kitbuildinfo 2 end]] + + ## Determine Kit OS from random file names + unset -nocomplain kitos kitcpu + if {[lsearch -exact $kitbuildinfo "win32"] != -1} { + set idx [lsearch -exact $kitbuildinfo "win32"] + set kitbuildinfo [lreplace $kitbuildinfo $idx $idx] + set kitos "windows" + set kitcpu "i586" + } elseif {[lsearch -exact $kitbuildinfo "arm"] != -1} { + set idx [lsearch -exact $kitbuildinfo "arm"] + set kitbuildinfo [lreplace $kitbuildinfo $idx $idx] + set kitos "linux" + set kitcpu "arm" + } else { + set idx [lsearch -exact $kitbuildinfo "normal"] + if {$idx != -1} { + set kitbuildinfo [lreplace $kitbuildinfo $idx $idx] + } + + set kitos [string tolower $tcl_platform(os)] + set kitcpu [string tolower $tcl_platform(machine)] + } + + # Generate array to describe this kit + unset -nocomplain kitinfo + set kitinfo(version) $tclversion + set kitinfo(file) $shortfile + set kitinfo(buildfile) $buildfile + set kitinfo(failedtests) $failedtests + set kitinfo(buildflags) $kitbuildinfo + set kitinfo(os) $kitos + set kitinfo(cpu) $kitcpu + + # Store kit information with all kits + set key [list $tclversion $kitos $kitcpu] + lappend allkitinfo($key) [array get kitinfo] +} + +puts $fd "" +puts $fd " " +puts $fd " KitCreator Build Status" +puts $fd " " +puts $fd " " +puts $fd " " +foreach key [lsort -dictionary [array names allkitinfo]] { + puts $fd " " + puts $fd " " + puts $fd " " + puts $fd " " + puts $fd " " + puts $fd " " + foreach kitinfo_list $allkitinfo($key) { + puts $fd " " + unset -nocomplain kitinfo + array set kitinfo $kitinfo_list + + if {[llength $kitinfo(failedtests)] == 0} { + set status "OK" + set bgcolor "green" + } else { + set status "FAILED" + set bgcolor "yellow" + } + + set failedtestshtml [list] + foreach test [lsort -dictionary $kitinfo(failedtests)] { + set testname [file rootname $test] + set testname [split $testname -] + + for {set idx 0} {$idx < [llength $testname]} {incr idx} { + set val [lindex $testname $idx] + if {[string match {[0-9][0-9]} $val]} { + set testname [join [lrange $testname $idx end] -] + + break + } + } + + if {[lsearch -exact $noncriticaltests $testname] == -1} { + set bgcolor "red" + } + + lappend failedtestshtml "$testname" + } + - # Generate better Tcl version - case "${tclversion}" in - cvs_HEAD) - tclversion="from CVS HEAD" - ;; - cvs_*) - tclversion="from CVS tag $(echo "${tclversion}" | cut -f 2 -d _)" - ;; - esac + puts $fd " " + puts $fd " " + puts $fd " " + puts $fd " " + puts $fd " " + } - # Update description with count of failed tests - if [ "${failedtests_count}" != "0" ]; then - desc="${desc} (FAILED ${failedtests_count} of ${totaltests_count} tests)" - fi +} +puts $fd "
Tclkit for [pretty_print_key $key]StatusLogFailed Tests
[pretty_print_buildinfo $kitinfo(buildflags)]$status([pretty_print_size [file size [file join $WEBDIR $kitinfo(buildfile)]]])[join $failedtestshtml {, }]
" +puts $fd " " +puts $fd "" - desc="is a Tclkit for Tcl ${tclversion}${desc}" - -done - -rmdir "${WEBDIR}/failed" >/dev/null 2>/dev/null -ln -s ../index.ttml "${WEBDIR}/failed/" >/dev/null 2>/dev/null - -exit 0 +close $fd