Diff

Differences From Artifact [6cafb5c1e8]:

To Artifact [b70c6b112e]:


     1         -#! /bin/bash
     2         -
     3         -WEBDIR="/web/rkeene/devel/kitcreator/kitbuild"
     4         -export WEBDIR
     5         -
     6         -if [ ! -d "kits" ]; then
     7         -	echo 'Could not find kits/ directory, aborting.' >&2
     8         -
     9         -	exit 1
    10         -fi
    11         -
    12         -rm -rf "${WEBDIR}"
    13         -mkdir -p "${WEBDIR}" || exit 1
    14         -
    15         -cp -r kits/* "${WEBDIR}"
    16         -
    17         -ln -s ../index.ttml "${WEBDIR}/" >/dev/null 2>/dev/null
    18         -
    19         -totaltests_count="$(ls -1 tests/*.tcl | wc -l)"
    20         -
    21         -for file in "${WEBDIR}"/*; do
    22         -	if [ -d "${file}" ]; then
    23         -		continue
    24         -	fi
    25         -
    26         -	if echo "${file}" | egrep '\.(log|desc|ttml)$' >/dev/null; then
    27         -		continue
    28         -	fi
    29         -
    30         -	# Find out which tests failed
    31         -	failedtests_count="0"
    32         -	failedtests=""
    33         -	for faillog in "${file}"-[0-9][0-9]-*.log; do
    34         -		if [ ! -f "${faillog}" ]; then
    35         -			continue
    36         -		fi
    37         -
    38         -		failedtests_count=$[${failedtests} + 1]
    39         -		failedtests="${failedtests} $(basename "${faillog}")"
    40         -	done
    41         -
    42         -	# Generate description
    43         -	descfile="${file}.desc"
    44         -	shortfile="$(basename "${file}")"
    45         -	desc=""
    46         -
    47         -	tclversion="$(echo "${shortfile}" | cut -f 2 -d -)"
    48         -	parts="$(echo "${shortfile}" | cut -f 3- -d -)"
    49         -
    50         -	while [ "${parts}" != "" ]; do
    51         -		case "${parts}-" in
    52         -			normal-*)
    53         -				true
    54         -				;;
    55         -			arm-*)
    56         -				desc="${desc} on the CPU architecture MIPSEL/uClibc"
    57         -				;;
    58         -			win32-*)
    59         -				desc="${desc} for Microsoft Windows"
    60         -				;;
    61         -			threaded-*)
    62         -				desc="${desc} with threads support"
    63         -				;;
    64         -			min-*)
    65         -				desc="${desc} compiled minimally"
    66         -				;;
    67         -			static-*)
    68         -				desc="${desc} and statically"
    69         -				;;
    70         -			notk-*)
    71         -				if echo "${desc}" | grep -i support >/dev/null; then
    72         -					desc="${desc} and"
    73         -				fi
    74         -				desc="${desc} without Tk"
    75         -				;;
    76         -			statictk-*)
    77         -				if echo "${desc}" | grep -i support >/dev/null; then
    78         -					desc="${desc} and"
    79         -				fi
    80         -				desc="${desc} with Tk linked directly to the kit"
    81         -				;;
    82         -			zip-*)
    83         -				desc="${desc} using ZIP for Kit storage"
    84         -				;;
    85         -			*)
    86         -				echo "Unknown part (\"${parts}\"), skipping \"${shortfile}\"" >&2
    87         -				break
    88         -				;;
    89         -		esac
    90         -
    91         -		newparts="$(echo "${parts}" | cut -f 2- -d -)"
    92         -		if [ "${newparts}" = "${parts}" ]; then
    93         -			parts=""
    94         -		else
    95         -			parts="${newparts}"
    96         -		fi
    97         -	done
    98         -
    99         -	if [ -z "${desc}" ]; then
            1  +#! /usr/bin/env tclsh
            2  +
            3  +package require Tcl 8.5
            4  +
            5  +set WEBDIR "/web/rkeene/devel/kitcreator/kitbuild"
            6  +if {![file isdir "kits"]} {
            7  +	puts stderr "Could not find kits/ directory, aborting."
            8  +
            9  +        exit 1
           10  +}
           11  +
           12  +set noncriticaltests [list "05-locale"]
           13  +
           14  +##########################################################################
           15  +## PROCEDURES ############################################################
           16  +##########################################################################
           17  +proc pretty_print_key {key} {
           18  +	set version [lindex $key 0]
           19  +	set os [lindex $key 1]
           20  +	set cpu [lindex $key 2]
           21  +
           22  +	switch -glob -- $version {
           23  +		"cvs_HEAD" {
           24  +			set version "from CVS HEAD"
           25  +		}
           26  +		"cvs_*" {
           27  +			set tag [join [lrange [split $version _] 1 end] _]
           28  +			set version "from CVS tag $tag"
           29  +		}
           30  +		default {
           31  +			set version "version $version"
           32  +		}
           33  +	}
           34  +
           35  +	return "Tcl $version for [string totitle $os] on $cpu"
           36  +}
           37  +
           38  +proc pretty_print_buildinfo {buildinfo} {
           39  +	set desc [list]
           40  +	foreach tag [list min static notk statictk threaded zip] {
           41  +		if {[lsearch -exact $buildinfo $tag] != -1} {
           42  +			switch -- $tag {
           43  +				"min" {
           44  +					lappend desc "Minimally Built"
           45  +				}
           46  +				"static" {
           47  +					lappend desc "Statically Linked"
           48  +				}
           49  +				"notk" {
           50  +					lappend desc "Without Tk"
           51  +				}
           52  +				"statictk" {
           53  +					lappend desc "Tk linked to Kit"
           54  +				}
           55  +				"threaded" {
           56  +					lappend desc "Threaded"
           57  +				}
           58  +				"zip" {
           59  +					lappend desc "Kit Filesystem in Zip"
           60  +				}
           61  +			}
           62  +		}
           63  +	}
           64  +
           65  +	if {[llength $desc] == 0} {
           66  +		return "Default Build"
           67  +	}
           68  +
           69  +	return [join $desc {, }]
           70  +}
           71  +
           72  +proc pretty_print_size {size} {
           73  +	foreach unit [list "" K M G T P] {
           74  +		if {$size < 1024} {
           75  +			return "$size [string trim ${unit}B]"
           76  +		}
           77  +
           78  +		set size [expr {${size} / 1024}]
           79  +	}
           80  +}
           81  +
           82  +##########################################################################
           83  +## MAIN BODY #############################################################
           84  +##########################################################################
           85  +
           86  +file delete -force -- $WEBDIR
           87  +file mkdir $WEBDIR
           88  +
           89  +set fd [open [file join $WEBDIR index.html] w]
           90  +
           91  +file copy -force -- {*}[glob kits/*] $WEBDIR
           92  +
           93  +set totaltests_count [llength [glob tests/*.tcl]]
           94  +
           95  +foreach file [lsort -dictionary [glob -directory $WEBDIR *]] {
           96  +	if {[file isdirectory $file]} {
   100     97   		continue
   101         -	fi
           98  +	}
           99  +
          100  +	switch -glob -- $file {
          101  +		"*.log" - "*.ttml" - "*.html" - "*.desc" {
          102  +			continue
          103  +		}
          104  +	}
          105  +
          106  +	# Derive what we can from the filename
          107  +	set shortfile [file tail $file]
          108  +	set buildfile "${shortfile}-build.log"
          109  +	set failedtests [glob -nocomplain -tails -directory $WEBDIR "${shortfile}-\[0-9\]\[0-9\]-*.log"]
          110  +
          111  +	## Split the filename into parts and store each part
          112  +	set kitbuildinfo [split $shortfile -]
          113  +	set tclversion [lindex $kitbuildinfo 1]
          114  +	set kitbuildinfo [lsort -dictionary [lrange $kitbuildinfo 2 end]]
          115  +
          116  +	## Determine Kit OS from random file names
          117  +	unset -nocomplain kitos kitcpu
          118  +	if {[lsearch -exact $kitbuildinfo "win32"] != -1} {
          119  +		set idx [lsearch -exact $kitbuildinfo "win32"]
          120  +		set kitbuildinfo [lreplace $kitbuildinfo $idx $idx]
          121  +		set kitos "windows"
          122  +		set kitcpu "i586"
          123  +	} elseif {[lsearch -exact $kitbuildinfo "arm"] != -1} {
          124  +		set idx [lsearch -exact $kitbuildinfo "arm"]
          125  +		set kitbuildinfo [lreplace $kitbuildinfo $idx $idx]
          126  +		set kitos "linux"
          127  +		set kitcpu "arm"
          128  +	} else {
          129  +		set idx [lsearch -exact $kitbuildinfo "normal"]
          130  +		if {$idx != -1} {
          131  +			set kitbuildinfo [lreplace $kitbuildinfo $idx $idx]
          132  +		}
          133  +
          134  +		set kitos [string tolower $tcl_platform(os)]
          135  +		set kitcpu [string tolower $tcl_platform(machine)]
          136  +	}
          137  +
          138  +	# Generate array to describe this kit
          139  +	unset -nocomplain kitinfo
          140  +	set kitinfo(version) $tclversion
          141  +	set kitinfo(file) $shortfile
          142  +	set kitinfo(buildfile) $buildfile
          143  +	set kitinfo(failedtests) $failedtests
          144  +	set kitinfo(buildflags) $kitbuildinfo
          145  +	set kitinfo(os) $kitos
          146  +	set kitinfo(cpu) $kitcpu
          147  +
          148  +	# Store kit information with all kits
          149  +	set key [list $tclversion $kitos $kitcpu]
          150  +	lappend allkitinfo($key) [array get kitinfo]
          151  +}
          152  +
          153  +puts $fd "<html>"
          154  +puts $fd "  <head>"
          155  +puts $fd "    <title>KitCreator Build Status</title>"
          156  +puts $fd "  </head>"
          157  +puts $fd "  <body>"
          158  +puts $fd "    <table cellpadding=\"2\" border=\"1\">"
          159  +foreach key [lsort -dictionary [array names allkitinfo]] {
          160  +	puts $fd "      <tr>"
          161  +	puts $fd "        <th><u>Tclkit for [pretty_print_key $key]</u></th>"
          162  +	puts $fd "        <th>Status</th>"
          163  +	puts $fd "        <th>Log</th>"
          164  +	puts $fd "        <th>Failed Tests</th>"
          165  +	puts $fd "      </tr>"
          166  +	foreach kitinfo_list $allkitinfo($key) {
          167  +		puts $fd "      <tr>"
          168  +		unset -nocomplain kitinfo
          169  +		array set kitinfo $kitinfo_list
          170  +
          171  +		if {[llength $kitinfo(failedtests)] == 0} {
          172  +			set status "OK"
          173  +			set bgcolor "green"
          174  +		} else {
          175  +			set status "FAILED"
          176  +			set bgcolor "yellow"
          177  +		}
          178  +
          179  +		set failedtestshtml [list]
          180  +		foreach test [lsort -dictionary $kitinfo(failedtests)] {
          181  +			set testname [file rootname $test]
          182  +			set testname [split $testname -]
          183  +
          184  +			for {set idx 0} {$idx < [llength $testname]} {incr idx} {
          185  +				set val [lindex $testname $idx]
          186  +				if {[string match {[0-9][0-9]} $val]} {
          187  +					set testname [join [lrange $testname $idx end] -]
          188  +
          189  +					break
          190  +				}
          191  +			}
          192  +
          193  +			if {[lsearch -exact $noncriticaltests $testname] == -1} {
          194  +				set bgcolor "red"
          195  +			}
          196  +
          197  +			lappend failedtestshtml "<small><a href=\"$test\">$testname</a></small>"
          198  +		}
          199  +
   102    200   
   103         -	# Generate better Tcl version
   104         -	case "${tclversion}" in
   105         -		cvs_HEAD)
   106         -			tclversion="from CVS HEAD"
   107         -			;;
   108         -		cvs_*)
   109         -			tclversion="from CVS tag $(echo "${tclversion}" | cut -f 2 -d _)"
   110         -			;;
   111         -	esac
          201  +		puts $fd "        <td><a href=\"$kitinfo(file)\">[pretty_print_buildinfo $kitinfo(buildflags)]</a></td>"
          202  +		puts $fd "        <td bgcolor=\"$bgcolor\">$status</td>"
          203  +		puts $fd "        <td><small><a href=\"$kitinfo(buildfile)\">([pretty_print_size [file size [file join $WEBDIR $kitinfo(buildfile)]]])</a></small></td>"
          204  +		puts $fd "        <td>[join $failedtestshtml {, }]</td>"
          205  +		puts $fd "      </tr>"
          206  +	}
   112    207   
   113         -	# Update description with count of failed tests
   114         -	if [ "${failedtests_count}" != "0" ]; then
   115         -		desc="${desc} (FAILED ${failedtests_count} of ${totaltests_count} tests)"
   116         -	fi
          208  +}
          209  +puts $fd "    </table>"
          210  +puts $fd "  </body>"
          211  +puts $fd "</html>"
   117    212   
   118         -	desc="is a Tclkit for Tcl ${tclversion}${desc}"
   119         -
   120         -done
   121         -
   122         -rmdir "${WEBDIR}/failed" >/dev/null 2>/dev/null
   123         -ln -s ../index.ttml "${WEBDIR}/failed/" >/dev/null 2>/dev/null
   124         -
   125         -exit 0
          213  +close $fd