Return-Path: Delivered-To: apmail-incubator-stdcxx-commits-archive@www.apache.org Received: (qmail 14523 invoked from network); 1 Jan 2008 01:22:05 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 1 Jan 2008 01:22:05 -0000 Received: (qmail 76281 invoked by uid 500); 1 Jan 2008 01:21:53 -0000 Delivered-To: apmail-incubator-stdcxx-commits-archive@incubator.apache.org Received: (qmail 76269 invoked by uid 500); 1 Jan 2008 01:21:53 -0000 Mailing-List: contact stdcxx-commits-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: stdcxx-dev@incubator.apache.org Delivered-To: mailing list stdcxx-commits@incubator.apache.org Received: (qmail 76258 invoked by uid 99); 1 Jan 2008 01:21:53 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 31 Dec 2007 17:21:53 -0800 X-ASF-Spam-Status: No, hits=-100.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO eris.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 01 Jan 2008 01:21:46 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 149EC1A984E; Mon, 31 Dec 2007 17:21:36 -0800 (PST) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r607788 - in /incubator/stdcxx/trunk: bin/xbuildgen bin/xcomp.awk etc/config/xfail.txt Date: Tue, 01 Jan 2008 01:21:35 -0000 To: stdcxx-commits@incubator.apache.org From: sebor@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20080101012136.149EC1A984E@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: sebor Date: Mon Dec 31 17:21:34 2007 New Revision: 607788 URL: http://svn.apache.org/viewvc?rev=607788&view=rev Log: 2007-12-31 Martin Sebor STDCXX-683 * bin/xbuildgen (xfailfile): New constant containing the pathname to the expected failures file. Used the title attribute directly in each element for simplicity intead of adding
all over the place. (Logs and Columns table): Temporarily removed/commented out all six component columns until the xcomp.awk script has been enhanced to generate the whole table instead. (Logs and Columns table): Added minimum, maximum, total, and average rows for each of the sizes columns. (resultstle.css): Added caption, tr. Renamed missing to MISS. Removed padding from td.name and background from td.total. (process_components): Removed and invoked xcomp.awk (with xfailfile as an argument) to process all components in a single shot instead. * bin/xcomp.awk: Rewrote from scratch to process the entire build log, including all examples, locales, and tests, in one go to simplify things and for efficiency. Implemented the "expected failures feature. * etc/config/xfail.txt: Initial (demo) version of the list of expected failures. Added: incubator/stdcxx/trunk/etc/config/xfail.txt (with props) Modified: incubator/stdcxx/trunk/bin/xbuildgen incubator/stdcxx/trunk/bin/xcomp.awk Modified: incubator/stdcxx/trunk/bin/xbuildgen URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/bin/xbuildgen?rev=607788&r1=607787&r2=607788&view=diff ============================================================================== --- incubator/stdcxx/trunk/bin/xbuildgen (original) +++ incubator/stdcxx/trunk/bin/xbuildgen Mon Dec 31 17:21:34 2007 @@ -86,6 +86,9 @@ # URL to the trunk of the source repository readonly svnpath="$viewvc/incubator/stdcxx/trunk" +# expected failures +readonly xfailfile=$HOME/stdcxx/etc/config/xfail.txt + ###################################################################### # global variables @@ -290,8 +293,6 @@ # in cases when it fails to build # echo "$myname: warning: unable to extract library size from $l" >&2 unset libsize - else - libsize=`format_size $libsize` fi echo $libsize @@ -634,6 +635,13 @@ font-family:courier; font-size: 80%; } +caption { + background:lightslategray; + color:lightgray; + font-weight:bold; + font-family:lucida mono; + font-size: 120%; +} th { background:lightgray; text-align:center; @@ -642,20 +650,19 @@ td { padding: 2px; text-align: center; +} +tr { background:powderblue; } td.rowno { - padding: 3px; text-align: right; background:lightgray; } td.name { - padding: 3px; text-align: left; background:lightblue; } td.number { - padding: 3px; text-align: center; background:lightblue; } @@ -663,14 +670,13 @@ background:white; text-align:left; } -td.header { +.header { background:#cccccc; text-align:center; font-weight:bold; font-family:lucida mono; } td.total { - background:#cccccc; text-align:center; font-weight:bold; } @@ -700,7 +706,7 @@ text-align:center; font-weight:bold; } -td.missing { +td.MISS { color:white; background:lightgray; text-align:center; @@ -856,17 +862,11 @@ # the location of the logs logdir="http://people.apache.org/~sebor/stdcxx/results" -# the names of temporary files containing the list of components -# (examples, locales, and tests) to process and include in the -# generated report -tests_file=$TMP/.stdcxx-tests.$$ -examples_file=$TMP/.stdcxx-examples.$$ -locales_file=$TMP/.stdcxx-locales.$$ +# the name of a temporary file containing the build timings timings_file=$TMP/.stdcxx-timings.$$ - -# remove temporary files in case they exist -rm -f $tests_file $examples_file $locales_file +# remove the temporary file +rm -f timings_file if [ $? -ne 0 ]; then exit 2 @@ -886,32 +886,18 @@ - + - - - - - - - + + + + + + + @@ -944,51 +930,39 @@
log
log build
type
build and run times (M:SS)
-
config
-
-
library
-
-
examples
-
-
utilities
-
-
tests
-
-
run times
-
-
total
-
configlibraryexamplesutilitiestestsrun timestotal
real
- + - + - + - + - + - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + @@ -1004,18 +978,44 @@ # the text files are stored in the textlogs variable # number of logs processed in loop below -n=0 +logcount=0 # space-separated list of names of text logs processed in loop below textlogs="" -# running total number of examples, locales, and tests in all logs -total_examples=0 -total_locales=0 -total_tests=0 +# the minimum, maximum, and the sum of library sizes +libsize_min=9999999999 +libsize_max=0 +libsize_sum=0 + +# the minimum, maximum, and the sum of compressed log sizes +gzlogsize_min=9999999999 +gzlogsize_max=0 +gzlogsize_sum=0 + +# the minimum, maximum, and the sum of uncompressed log sizes +txtlogsize_min=9999999999 +txtlogsize_max=0 +txtlogsize_sum=0 + +# the number of logs counted equals logcount (see above) + +# the minimum, maximum, and the sum of full build sizes +fullbuildsize_min=9999999999 +fullbuildsize_max=0 +fullbuildsize_sum=0 + +# the minimum, maximum, and the sum of clean build sizes +cleanbuildsize_min=9999999999 +cleanbuildsize_max=0 +cleanbuildsize_sum=0 + +# the number of build sizes counted +buildsize_count=0 + for l in $gzlogs; do - n=$((n + 1)) + logcount=$((logcount + 1)) fname=`basename $l` if [ $verbose -eq 1 ]; then @@ -1023,11 +1023,10 @@ fi # set temporary variables (valid only within the loop) - runlog=$TMP/`basename $l`.$$ - txtlog=$TMP/`basename $l`.txt.$$ + txtlog=$TMP/`basename $l .gz.txt`.txt.$$ # append the name of the log to the list - textlogs="$textlogs $runlog" + textlogs="$textlogs $txtlog" # unzip the log into a temporary text file gunzip -c $l > $txtlog @@ -1039,10 +1038,34 @@ # determine the size of the compressed and decompressed log gzlogsize=`wc -c $l` - gzlogsize=`format_size ${gzlogsize% *}` + gzlogsize=${gzlogsize% *} + + if [ $gzlogsize -lt $gzlogsize_min ]; then + gzlogsize_min=$gzlogsize + fi + + if [ $gzlogsize -gt $gzlogsize_max ]; then + gzlogsize_max=$gzlogsize + fi + + gzlogsize_sum=$((gzlogsize_sum + gzlogsize)) + + gzlogsize=`format_size $gzlogsize` txtlogsize=`wc -c $txtlog` - txtlogsize=`format_size ${txtlogsize% *}` + txtlogsize=${txtlogsize% *} + + if [ $txtlogsize -lt $txtlogsize_min ]; then + txtlogsize_min=$txtlogsize + fi + + if [ $txtlogsize -gt $txtlogsize_max ]; then + txtlogsize_max=$txtlogsize + fi + + txtlogsize_sum=$((txtlogsize_sum + txtlogsize)) + + txtlogsize=`format_size $txtlogsize` # extract the date and time the build started # the date is expected to be introduced by a line like this: @@ -1068,6 +1091,22 @@ # extract the size of the library binary from the build log libsize=`get_lib_size $txtlog` + if [ "$libsize" != "" ]; then + if [ $libsize -lt $libsize_min ]; then + libsize_min=$libsize + fi + + if [ $libsize -gt $libsize_max ]; then + libsize_max=$libsize + fi + + libsize_sum=$((libsize_sum + libsize)) + + libsize=`format_size $libsize` + libcount=$((libcount + 1)) + fi + + # extract the size of the whole build introduced by a line # containing the strings "# du -sk build", both before and # afterit's been cleaned @@ -1086,6 +1125,31 @@ fullbuildsize=$((fullbuildsize * 1024)) cleanbuildsize=$((cleanbuildsize * 1024)) + if [ "$fullbuildsize" != "" ]; then + + # compute the minimum, maximum, sum, and average + if [ $fullbuildsize -lt $fullbuildsize_min ]; then + fullbuildsize_min=$fullbuildsize + fi + + if [ $cleanbuildsize -lt $cleanbuildsize_min ]; then + cleanbuildsize_min=$cleanbuildsize + fi + + if [ $fullbuildsize -gt $fullbuildsize_max ]; then + fullbuildsize_max=$fullbuildsize + fi + + if [ $cleanbuildsize -gt $cleanbuildsize_max ]; then + cleanbuildsize_max=$cleanbuildsize + fi + + fullbuildsize_sum=$((fullbuildsize_sum + fullbuildsize)) + cleanbuildsize_sum=$((cleanbuildsize_sum + cleanbuildsize)) + + buildsize_count=$((buildsize_count + 1)) + fi + fullbuildsize=`format_size $fullbuildsize` cleanbuildsize=`format_size $cleanbuildsize` fi @@ -1136,8 +1200,8 @@ fbase=${fbase%-$buildtype} # componse the column header - colhdr="
$n" - colhdr="$colhdr
" + colhdr="$logcount" + colhdr="$colhdr" # when displaying one component (example, test, or locale) per row # of the table, format the table header so as to include the build @@ -1148,10 +1212,12 @@ tbl_hdr_2="$tbl_hdr_2 " if [ "$libsize" = "" ]; then - output " " + table_row=" " else - output " " + table_row=" " fi + + output "$table_row" output " " output " " output " " @@ -1167,10 +1233,11 @@ output " " output " " output " " + output " " cat <>$timings_file - + $table_row EOF @@ -1187,105 +1254,59 @@ echo " " >>$timings_file fi +done - # cut the first part up to the first table from the text log - sed -e "1,/^NAME *STATUS/d" $txtlog > $runlog - - status=$? - - if [ $status -eq 0 ]; then - - # extract the list of locales from the log - # removing the .bat or .sh suffix from their names - - sed -e "/^PROGRAM SUMMARY:/,999999d" $runlog \ - | sed -e "s/^\([^ ][^ ]*\) *.*/\1/" \ - | sed -e "s/^\([^ ][^ ]*\)\.bat/\1/" \ - -e "s/^\([^ ][^ ]*\)\.sh/\1/" >>$locales_file \ - && sed -e "1,/^NAME *STATUS/d" $runlog > $runlog.next - - status=$? - - if [ $verbose -eq 1 ]; then - echo "$myname: extracted locale results into $locales_file" - fi - else - exit 3 - fi - - if [ $status -eq 0 ]; then - - # extract the list of tests from the log - # removing the .exe suffix from their names - - sed -e "/^PROGRAM SUMMARY:/,999999d" $runlog.next \ - | sed -e "s/^\([^ ][^ ]*\) *.*/\1/" \ - | sed -e "s/^\([^ ][^ ]*\)\.exe/\1/" >>$tests_file \ - && sed -e "1,/^NAME *STATUS/d" $runlog.next > $runlog.next.2 \ - && mv $runlog.next.2 $runlog.next - - status=$? - - if [ $verbose -eq 1 ]; then - echo "$myname: extracted test results into $tests_file" - fi - else - exit 3 - fi - - if [ $status -eq 0 ]; then - - # extract the list of examples from the log - # removing the .exe suffix from their names - - sed -e "/^PROGRAM SUMMARY:/,999999d" $runlog.next \ - | sed -e "s/^\([^ ][^ ]*\) *.*/\1/" \ - | sed -e "s/^\([^ ][^ ]*\)\.exe/\1/" >>$examples_file \ - && sed -e "1,/^NAME *STATUS/d" $runlog > $runlog.next.2 \ - && mv $runlog.next.2 $runlog.next - - if [ $verbose -eq 1 ]; then - echo "$myname: extracted example results into $examples_file" - fi - else - exit 3 - fi - - if [ $components_in_rows -ne 0 ]; then - - # get the number of components of each kind in the log - nexamples=`wc -l $examples_file` - nlocales=`wc -l $locales_file` - ntests=`wc -l $tests_file` - - nexamples=${nexamples% *} - nlocales=${nlocales% *} - ntests=${ntests% *} - - output " " - output " " - output " " - output " " - - total_examples=$nexamples - total_locales=$nlocales - total_tests=$ntests - fi - - if [ ! -s $runlog ]; then - # make sure file is not empty - echo "###" >$runlog - fi +if [ $components_in_rows -ne 0 ]; then - rm $runlog.next - rm $txtlog -done + gzlogsize_avg=$((gzlogsize_sum / logcount)) + txtlogsize_avg=$((txtlogsize_sum / logcount)) + libsize_avg=$((libsize_sum / libcount)) -if [ $components_in_rows -ne 0 ]; then + fullbuildsize_avg=$((fullbuildsize_sum / buildsize_count)) + cleanbuildsize_avg=$((cleanbuildsize_sum / buildsize_count)) output " " + output " " + output " " + output " " + output " " + output " " + output " " + output " " + output " " + output " " + output " " + output " " + output " " + output " " + output " " + output " " + output " " + output " " + output " " + output " " + output " " + output " " + output " " + output " " + output " " + output " " + output " " + output " " + output " " + output " " + output " " + output " " + output " " + output " " + output " " + output " " + output " " + output " " + output " " + output " " output "
log
log operating
system
arch
arch compiler build
type
start date and time -
- age -
-
age revision sizes diagnosticscomponents
-
library
-
library log build -
errors
-
-
warnings
-
-
examples
-
-
locales
-
-
tests
-
gzip
text
full
clean
errorswarnings
gziptextfullclean
$buildtype
$colhdr$osname$arch$cleanbuildsize$errors$warnings
$colhdr $buildtype
$((nexamples - total_examples))$((nlocales - total_locales))$((ntests - total_tests))
min`format_size $libsize_min``format_size $gzlogsize_min``format_size $txtlogsize_min``format_size $fullbuildsize_min``format_size $cleanbuildsize_min`
max`format_size $libsize_max``format_size $gzlogsize_max``format_size $txtlogsize_max``format_size $fullbuildsize_max``format_size $cleanbuildsize_max`
total`format_size $libsize_sum``format_size $gzlogsize_sum``format_size $txtlogsize_sum``format_size $fullbuildsize_sum``format_size $cleanbuildsize_sum`
average`format_size $libsize_avg``format_size $gzlogsize_avg``format_size $txtlogsize_avg``format_size $fullbuildsize_avg``format_size $cleanbuildsize_avg`
" output "
" @@ -1299,12 +1320,12 @@ output "
    " - n=0 + logcount=0 for c in $example_list $test_list $locale_list; do - n=$((n + 1)) + logcount=$((logcount + 1)) # output one build per row, with components in columns - table_header="$table_header
    $n
    " + table_header="$table_header $logcount" output "
  1. $c
  2. " done @@ -1313,147 +1334,10 @@ output "
    " -if [ -s $locales_file ]; then - # if the list of locales non-empty sort it and weed out duplicates - sort $locales_file | uniq > $locales_file.2 \ - && mv $locales_file.2 $locales_file -fi - -if [ -s $examples_file ]; then - # if the list of examples is non-empty sort it and weed out duplicates - sort $examples_file | uniq > $examples_file.2 \ - && mv $examples_file.2 $examples_file -fi - -if [ -s $tests_file ]; then - # if list of tests file is non-empty sort it and weed out duplicates - sort $tests_file | uniq > $tests_file.2 \ - && mv $tests_file.2 $tests_file -fi - ###################################################################### -awkscript=$HOME/stdcxx/bin/xcomp.awk - -###################################################################### - -# process a list of components, one component per row -# component name is one of: { example, locale, test } -process_components() -{ - component_type=$1 # example, locale, or test - component_list=$2 # list of component names - - count=`echo $component_list | wc -w` - - if [ "$component_type" = "test" ]; then - column3="
    " - column3="$column3 max
    asserts
    " - else - unset column3 - fi - - cat <Results of $count ${component_type}s -

    - Note: ${component_type}s passing across all builds have been omitted - for brevity. -

    - - - - - - $column3 - $tbl_hdr_1 - - $tbl_hdr_2 - - -EOF - - totals_file=$TMP/.stdcxx-failtotals.$$.txt - - # iterate over the list of idividual components (examples, tests, - # or locales) invoking the awk script on each of them (i.e., each - # example, test, or locale) in every iteration of the loop - n=0; - for c in $component_list; do - - # compute the sequential component number and pass it - # to the awk script to include it on the row it generates - # (if it generates one) - n=$((n + 1)) - - # the display name of the component - dispname="$c" - - # determine the directory in the source repository the component - # source lives in - if [ "example" = $component_type ]; then - dir="" - elif [ "locale" = $component_type ]; then - locale=${c%.*} - if [ "$locale" != "$c" ]; then - - # compose a URL pointing to the character set description - # file and the locale defintion file in the repository - codeset=${c#*.} - - url="$svnpath/etc/nls/src/$locale?view=markup" - dispname="$locale" - - url="$svnpath/etc/nls/charmaps/$codeset?view=markup" - dispname="$dispname.$codeset" - fi - elif [ "test" = $component_type ]; then - - dir="tests" - - case $c in - *.stdcxx-*) dir="$dir/regress";; - 0.*) dir="$dir/self";; - 17.*) dir="$dir/intro";; - 18.*) dir="$dir/support";; - 19.*) dir="$dir/diagnostics";; - 20.*) dir="$dir/utilities";; - 21.*) dir="$dir/strings";; - 22.*) dir="$dir/localization";; - 23.*) dir="$dir/containers";; - 24.*) dir="$dir/iterators";; - 25.*) dir="$dir/algorithm";; - 26.*) dir="$dir/numerics";; - 27.*) dir="$dir/iostream";; - *) dir="";; - esac - - if [ "$dir" != "" ]; then - dispname="$c" - fi - fi - - awk -f $awkscript \ - n=$n dir=$dir name=$c dispname="$dispname" verbose=$verbose \ - comptype=$component_type totalsfile=$totals_file $textlogs \ - | output - - done - - # set name to bogus value and invoke the script again - # to get it to print summary information - echo "" | awk -f $awkscript comptype=$component_type name="@" \ - totalsfile=$totals_file svnpath=$svnpath \ - | output - - cat < -
    -
    ###
    -
    - $component_type name -
    -EOF -} +# xcross-component script +xcomp=$HOME/stdcxx/bin/xcomp.awk ###################################################################### @@ -1487,8 +1371,8 @@ line=`grep "^$c *[^-]" $l` if [ $? -eq 0 -a "$line" != "" ]; then echo $line \ - | awk -f $awkscript component=$component_type \ - name=$c verbose=$verbose svnpath=$svnpath \ + | awk -f $xcomp component=$component_type \ + name=$c verbose=$verbose expect="$expect" \ | output else output " N/A" @@ -1502,9 +1386,15 @@ if [ $components_in_rows -ne 0 ]; then - process_components "example" "`cat $examples_file`" - process_components "test" "`cat $tests_file`" - process_components "locale" "`cat $locales_file`" + + # check to see + if [ -r $xfailfile ]; then + xfails=$xfailfile + else + xfails="" + fi + + awk -f $xcomp bodyonly=1 $xfails $textlogs | output else if [ "$examples_list" != "" ]; then process_builds "example" "$examples_list" @@ -1532,17 +1422,12 @@ Meaning - -
    - - Unexpected -
    + + Unexpected Severity - -
    - Expected -
    + + Expected Severity @@ -1577,7 +1462,7 @@
    Not Applicable
    - FMAT + FORMAT Success Component completed successfully but produced unexpected @@ -1585,7 +1470,7 @@ - N/A + N/A Success
    Not Applicable
    Component was not tested. @@ -1796,11 +1681,8 @@ # clean up if [ $verbose -eq 1 ]; then - echo "$myname: " \ - "rm $examples_file $tests_file $locales_file " \ - "$textlogs $timings_file" + echo "$myname: rm $textlogs $timings_file" fi - rm $examples_file $tests_file $locales_file $textlogs \ - $timings_file + rm -f $textlogs $timings_file fi Modified: incubator/stdcxx/trunk/bin/xcomp.awk URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/bin/xcomp.awk?rev=607788&r1=607787&r2=607788&view=diff ============================================================================== --- incubator/stdcxx/trunk/bin/xcomp.awk (original) +++ incubator/stdcxx/trunk/bin/xcomp.awk Mon Dec 31 17:21:34 2007 @@ -23,450 +23,1181 @@ ######################################################################## # # SYNOPSIS -# myname [n=#] [name=$name] [dispname=$dispname] -# [svnpath=$svnpath] [verbose=0|1] [comptype=$comp] -# [totalsfile=$totalsfile] [expectfile=$expectfile] -# logs... +# myname [comptype=] [bodyonly=0|1] logs... # # VARIABLES: -# n component number -# name component name -# dispname component display name -# verbose verbose mode +# bodyonly when non-zero, suppresses the tags # comptype component type (example, locale, or test) -# totalsfile name of totals file -# expectfile name of file with expected results +# expect set of expected results # ######################################################################## BEGIN { - # the text of all columns, output after all logs have been processed - columns = "" + # array of component counts for each component + # compcnts [] - # total number of times the current component has been found to fail - # across all logs (a row for the component is normally output only - # when compfails is non-zero, except when in verbose mode) - compfails = 0 + # one-based array of files processed + # files [1..] - # maximum and minimum number of assertions for the current component - max_asserts = 0 - min_asserts = -1 + # map of [FILENAME,components] to component status + # compstatuses [FILENAME, compcnts] - # one-based file number (the first file on the command line - # is number one, etc.) - fileno = 0 + sectnames [1] = "locale" + sectnames [2] = "test" + sectnames [3] = "example" + + # displayed and cout as failures + states ["ASSERT"] = 1 + states ["BUILD"] = 1 + states ["COMP"] = 1 + states ["DIFF"] = 1 + states ["EXEC"] = 1 + states ["FORMAT"] = 1 + states ["EXIT"] = 1 + states ["LINK"] = 1 + states ["SIGNAL"] = 1 + + # displayed but don't cout as failures + states ["OUTPUT"] = -1 + states ["WARN"] = -1 + + # expected failures are displayed but not counted as failures + states ["XASSERT"] = -1 + states ["XBUILD"] = -1 + states ["XCOMP"] = -1 + states ["XDIFF"] = -1 + states ["XEXEC"] = -1 + states ["XFORMAT"] = -1 + states ["XEXIT"] = -1 + states ["XLINK"] = -1 + states ["XPASS"] = -1 + states ["XSIGNAL"] = -1 + + # not displayed and doesn't cout as a failure + states ["MISS"] = 0 + states ["OK"] = 0 + + # add all states/classes that count as failures to failclasses + for (e in states) { + if (1 == states [e]) + failclasses [e] + } - # the (one-based) number of the file in which the current - # component was last found (detects a component that is - # missing from one or more files) - found_in_file = -1 + # month numbers used to format dates + monthnames ["Jan"] = 1 + monthnames ["Feb"] = 2 + monthnames ["Mar"] = 3 + monthnames ["Apr"] = 4 + monthnames ["May"] = 5 + monthnames ["Jun"] = 6 + monthnames ["Jul"] = 7 + monthnames ["Aug"] = 8 + monthnames ["Sep"] = 9 + monthnames ["Oct"] = 10 + monthnames ["Nov"] = 11 + monthnames ["Dec"] = 12 + + # mapping from build type to the more descriptive build mode + buildmodes ["8a"] = "shared archive, optimized" + buildmodes ["8A"] = "shared archive, optimized, wide" + buildmodes ["8d"] = "shared, optimized" + buildmodes ["8D"] = "shared, optimized, wide" + buildmodes ["8s"] = "archive, optimized" + buildmodes ["8S"] = "archive, optimized, wide" + buildmodes ["11a"] = "shared archive, debug" + buildmodes ["11A"] = "shared archive, debug, wide" + buildmodes ["11d"] = "shared, debug" + buildmodes ["11D"] = "shared, debug, wide" + buildmodes ["11s"] = "archive, debug" + buildmodes ["11S"] = "archive, debug, wide" + buildmodes ["12a"] = "shared archive, optimized, reentrant" + buildmodes ["12A"] = "shared archive, optimized, reentrant, wide" + buildmodes ["12d"] = "shared, optimized, reentrant" + buildmodes ["12D"] = "shared, optimized, reentrant, wide" + buildmodes ["12s"] = "archive, optimized, reentrant" + buildmodes ["12S"] = "archive, optimized, reentrant, wide" + buildmodes ["15a"] = "shared archive, debug, reentrant" + buildmodes ["15A"] = "shared archive, debug, reentrant, wide" + buildmodes ["15d"] = "shared, debug, reentrant" + buildmodes ["15D"] = "shared, debug, reentrant, wide" + buildmodes ["15s"] = "archive, debug, reentrant" + buildmodes ["15S"] = "archive, debug, reentrant, wide" + + svnpath="http://svn.apache.org/viewvc/incubator/stdcxx/trunk" + + # regular expression to match a name (e.g., compiler or OS) + re_name = "[A-Za-z][A-Za-z_0-9]*" + + # regular expression to match a version string + re_version = "[1-9][0-9]*(\\.[0-9][0-9]*)*" + + # regular expression matching the buildtype string + re_buildtype = "(8|11|12|15)[aAdDsS](-(solaris|win32))?" + + # regular expresssion matching a log file name + re_logname = re_name "-" re_version \ + "-" re_name "-" re_name "-" re_version \ + "-" re_buildtype "-" "[1-9][0-9]*-log" +} - # array of the total numbers of components found in each log - # logcounts - # array of the total numbers of failed components in each log - # logfails +# action to detect the type of file +1 == FNR { + section = 0 - # array of the total numbers of components in each log that - # failed one or more runtime assertions - # assertcounts + if (0 == match(FILENAME, re_logname)) { + # treat files whose names don't match the log file name pattern + # as lists of expected failures + expect_file = 1 + } + else { + expect_file = 0 - # array of the total numbers of components in each log that - # failed to build (compile or link) - # buildfails + logsections [FILENAME] = 0 - # array of the total numbers of components in each log that - # produced unexpected output (DIFF) - # diffcounts + logcompcnts [1, FILENAME] = 0 + logcompcnts [2, FILENAME] = 0 + logcompcnts [3, FILENAME] = 0 - # array of the total numbers of components in each log that - # exited with a non-zero status - # exitcounts + ++logcount - # array of the total numbers of components in each log that - # exited with a signal - # signalcounts + # append the current log file name to the list + logfnames [logcount] = FILENAME + } +} - # array of the total numbers of components in each log that - # exited with SIGHUP (likely timed out) - # sighupcounts - # array of the total numbers of components missing from each log - # missingcounts -} +# action to process file containing specification of expected failures +1 == expect_file && $1 ~ "^[^#][^#]" { + if (1 == index($0, " ")) { + # component specification continued from previous line + cont = 1 + } + else { + compname = $1 + cont = 0 + } -# action to keep track of the current file number -1 == FNR { - if (0 < fileno && found_in_file < fileno) { - ++missingcounts [fileno] + pattern = $(2 - cont) + status = $(3 - cont) + comment = $(4 - cont) + + # convert shell globbing pattern to a regular expression by + # escaping periods and replacing astersisks with ".*" and + # question marks with "." + gsub("\\.", "\\.", pattern) + gsub("\\*", ".*", pattern) + gsub("?", ".", pattern) + + # if patter contains an open brace expand it using the shell + if (0 < index(pattern, "{")) { + cmd = "echo " pattern + cmd | getline pattern + } + + # split the (potentially expanded) pattern into an array + n = split(pattern, patlist, " ") + + spec = "" + sep = "" - columns = columns "\n N/A" - found_in_file = -1 + # concatenate the array of expanded patters, the status, + # and the comment, to form a single specification + for (i = 1; i <= n; ++i) { + + spec = spec sep patlist [i] " " status " " comment + + sep = ":" } - ++fileno + # insert the specification to the expected_statuses array + if (compname in nexpected_statuses) + spec = expected_statuses [compname] ":" spec + + expected_statuses [compname] = spec + + # skip the actions below + next +} + + +######################################################################## +# logfile only processing below + +# action to extract the build date and time +/^##* *date *: *$/ { + + getline + + logdates [FILENAME] = $0 +} + + +# action at the beginning of component table +/^NAME *STATUS WARN/ { + start = 1 + + ++section + + ++logsections [FILENAME] + + logcompcnts [section, FILENAME] = 0 + + # skip this record + next +} + +# end of component table +/^PROGRAM SUMMARY:$/ { + + start = 0 +} + +0 == start { + # skip this record + next } -# match the first record to the name optionally followed -# by one of the three suffixes - $1 ~ "^" name "$" \ -|| $1 ~ "^" name ".bat$" \ -|| $1 ~ "^" name ".exe$" \ -|| $1 ~ "^" name ".sh$" { +# locale, example, or test section +1 == start { - # EXPECTED RECORD FORMAT(s) - # - # $1 $2 $3 $4 $5 $6 $7 $8 $9 - # - # - # $1 $2 $3 $4 $5 - # - # - # The , , , and fields might be missing. + compname = $1 - # increment the total of components found in this log - ++logcounts [fileno] + # trim suffix from component name + sub("(\\.bat|\\.exe|\\.sh)$", "", compname) - # the second field is always the exit status of the component - status = $2 + compstatus = $2 + expect = "" + comment = "" - # the tile (tooltip) to display over the value - title = "" + # increment the number of times the current component occurs + # in the current section across all logs + ++compcnts [section, compname] - # the value of the cell - value = "" + # increment the number of components in the current section + # and log + ++logcompcnts [section, FILENAME] - found_in_file = fileno + if (sectmaxcompcnts [section] < logcompcnts [section, FILENAME]) + sectmaxcompcnts [section] = logcompcnts [section, FILENAME] - if (status == 0) { + if (compname in expected_statuses) + expspec = expected_statuses [compname] + else + expspec = "" + n = split(expspec, slist, ":") + + for (i = 1; i <= n; ++i) { + + split(slist [i], fields, " ") + + # try to match the log file name against the specified pattern + if (match(FILENAME, fields [1])) { + # extract the expected component status and the comment + expect = fields [2] + comment = fields [3] + + break + } + } + + # class, value, and optional detail for the cell + class = "" + value = "" + detail = "" + + # compstatus: + # :[]:[] + + if (0 == compstatus) { # successful exit status - if (comptype == "example" || $5 == 0) { + class = "OK" - # component is an example or, when not, had zero failures + if (3 != section) { + runwarns = $3 + asserts = $4 + failed = $5 + + if (0 < failed) { + class = "ASSERT" + value = failed + detail = asserts + } + else if (0 < runwarns) { + class = "RUNWARN" + value = runwarns + } + } + + if (expect != "") { + if ("OK" == class && expect != class) { + # unexpected success + class = "XPASS" + value = "XPASS
    (X" expect ")" + detail = "unexpected success" + } + else if ("OK" != class) { + # expected status doesn't match + ++xmatchcounts [section, FILENAME] + + value = value "
    " expect + } + } + } + else if (0 < compstatus && compstatus < 256) { + # non-zero exit status + class = "EXIT" + value = compstatus - # get the number of warnings (only valid when the number - # fields is greater than 5) - warnings = 5 < NF ? $3 : 0 + if (expect != "") { + if (expect == value) { + # actual exit status matches the expected status + ++xfailcounts [section, FILENAME] - if (warnings == 0) { - class = "OK" - value = "0" + class = "X" class } else { - ++compfails; - ++logfails [fileno] + ++xmatchcounts [section, FILENAME] - class = "RUNWARN" - title = warnings " runtime warnings" - value = "(" warnings ")" + value = value "
    (X" expect ")" + detail = "expected failure doesn't match actual status" } } - else { - - # component is not an example or, when it is, had failures + } + else if ( "COMP" == compstatus \ + || "DIFF" == compstatus \ + || "FORMAT" == compstatus \ + || "LINK" == compstatus \ + || "NOUT" == compstatus \ + || "OUTPUT" == compstatus) { + # DIFF unexpected (example) output + # FORMAT unexpected (test) output format + # NOUT no (test) output + # OUTPUT no (example) master output file + class = compstatus + + if (expect != "") { + if (expect == class) { + # actual status matches expected status + ++xfailcounts [section, FILENAME] - ++compfails - ++logfails [fileno] - ++assertcounts [fileno] + class = "X" class + } + else { + # actual status doesn't match expected status + ++xmatchcounts [section, FILENAME] - class = "ASSERT" - title = $5 " failed assertions out of " $4 - value = "(" $5 ")" + value = class "
    (X" expect ")" + detail = "expected failure doesn't match actual status" + } } + } + else { + # signal - if (comptype == "test") { - asserts [n] = $5 + class = "SIGNAL" + value = compstatus + + if (expect != "") { + if (expect == value) { + # signal matches the expected signal + ++xfailcounts [section, FILENAME] - if (max_asserts < $4) { - max_asserts = $4 + class = "X" class } + else { + # signal doesn't match expected status + ++xmatchcounts [section, FILENAME] - if ($4 < min_asserts || min_asserts < 0) { - min_asserts = $4 + value = value "
    (X" expect ")" + detail = "expected failure doesn't match actual status" } } } - else if (0 < status && status < 256) { - ++compfails - ++logfails [fileno] - ++exitcounts [fileno] - class = "EXIT" - title = "exit status of " status - value = status - } - else if (status == "FORMAT" || status == "NOUT" || status == "OUTPUT") { - ++compfails + compstatus = class ":" value ":" detail + + compstatuses [section, FILENAME, compname] = compstatus +} + +# locale section +1 == section && 1 == start { +} - class = status - value = status == "FORMAT" ? "FMAT" : status +# test section +2 == section && 1 == start { +} + +# example section +3 == section && 1 == start { +} + + +######################################################################## +# functions + +function get_date(fulldate) +{ + split(fulldate, fields) + month = fields [2] + mday = fields [3] + + date = monthnames [month] "/" mday + + return date +} + + +function get_time(fulldate) +{ + split(fulldate, fields) + + return fields [4] +} + + +# extracts the build type from the log file name +function get_buildtype(fname) +{ + # look for the beginning of the buildtype component followed + # by the (Subversion) revision number + pos = match(fname, "-[1-9][0-9]*[aAdDsS]-[1-9][0-9]*-log") + + # is not found, try looking for the buildtype followed by + # the name of the threads library and only then followed + # by the (Subversion) revision number + if (0 == pos) + pos = match(fname, "-[1-9][0-9]*[aAdDsS]-[a-z][a-z]*-[1-9][0-9]*-log*") + + buildtype = substr(fname, pos + 1) + + pos = index(buildtype, "-") + buildtype = substr(buildtype, 1, pos - 1) + + return buildtype +} + + +function get_dispname(section, compname) +{ + dir = "" + + if (1 == section) { + # compose a URL pointing to the character set description + # file and the locale defintion file in the repository + pos = index(compname, ".") + if (0 < pos) { + locale = substr(compname, 1, pos - 1) + codeset = substr(compname, pos + 1); + + url = svnpath "/etc/nls/src/" locale "?view=markup" + dispname = "" locale "" + + url = svnpath "/etc/nls/charmaps/" codeset "?view=markup" + dispname = dispname "." codeset "" + } + else { + dispname = compname + } } - else if (status == "DIFF") { - ++compfails - ++logfails [fileno] - ++diffcounts [fileno] - - class = status - value = status - } - else if (status == "COMP" || status == "LINK") { - ++compfails - ++logfails [fileno] - ++buildfails [fileno] + else if (2 == section) { + dir = "tests" - class = status - value = status + if (match(compname, "\\.stdcxx-")) + dir = dir "/regress" + else if (match(compname, "^0\\.")) + dir = dir "/self" + else if (match(compname, "^17\\.")) + dir = dir "/intro" + else if (match(compname, "^18\\.")) + dir = dir "/support" + else if (match(compname, "^19\\.")) + dir = dir "/diagnostics" + else if (match(compname, "^20\\.")) + dir = dir "/utilities" + else if (match(compname, "^21\\.")) + dir = dir "/strings" + else if (match(compname, "^22\\.")) + dir = dir "/localization" + else if (match(compname, "^23\\.")) + dir = dir "/containers" + else if (match(compname, "^24\\.")) + dir = dir "/iterators" + else if (match(compname, "^25\\.")) + dir = dir "/algorithm" + else if (match(compname, "^26\\.")) + dir = dir "/numerics" + else if (match(compname, "^27\\.")) + dir = dir "/iostream" + else if (match(compname, "^d_")) + ; # dir = dir "/depr" + else + dir = "" + + if (dir != "") { + dispname = "" + dispname = dispname compname "" + } + else { + dispname = compname + } } else { - ++compfails - ++logfails [fileno] - if (status == "HUP" || status == "SIGHUP") - ++sighupcounts [fileno] - else - ++signalcounts [fileno] - - class = "SIGNAL" - value = status + dispname = compname } - columns = columns "\n " value "" + return dispname } -function print_totals (class, title, text, totals, nfields) +# prints a row of columns for the given section and component +function print_component(section, compname) { - sum = 0 + # increment for each component, regardless of whether it gets + # included in the output or not + ++compinx row = "" + + # the number of failures and warning states of the current + # component across all logs to decide whether to include + # the component in the output or not + nfailures = 0 + nwarnings = 0 + + # maximum number of assertions exercised by the current + # test across all logs + maxasserts = 0 + + # the number of columns to span the same class/value + repeat = 1 + + last_class = "" + last_value = "" + last_title = "" + + # iterate over all log files + for (i = 1; i <= logcount; ++i) { + + # only process the specified section + # if (section != substr(fi, 1, 1)) + # continue + + # extract the name of the log file from the key + # fname = substr(fi, 3) + fname = logfnames [i] + + # check to see if the component was found in the current + # log file being careful not to add a new entry to the + # array + if ((section, fname, compname) in compstatuses) { + + # component found + + status = compstatuses [section, fname, compname] + + n = split(status, triple, ":") + + class = triple [1] + value = "" == triple [2] ? class : triple [2] + title = triple [3] + + if ("ASSERT" == class) { + + if (0 < value) { + title = "failed " value " out of " \ + triple [3] " assertions" + } + else + title = "" + + if (maxasserts < triple [3]) + maxasserts = triple [3] + } + } + else { + # component missing from log file + class = "MISS" + title = "not tested" + value = "N/A" + } - for (i = 1; i <= nfields; ++i) { - sum += totals [i] + if (class in failclasses) { + ++nfailures + ++logcompfails [fname] + } + else if (class != "OK" && class != "MISS") { + ++nwarnings + ++logcompwarns [fname] + } + + if ("" == last_class) { + last_class = class + last_title = title + last_value = value + } + else if ( last_class == class \ + && last_value == value \ + && last_title == title) { + ++repeat + } + else { + row = row " " - if (totals [i] != 0) - row = row totals [i] + if (1 < repeat) { + row = row " colspan=" repeat + coltext = "columns " i - repeat " to " i - 1 + } + else { + coltext = "column " i - 1 + } - row = row "" + if (last_title == "") + last_title = coltext + else + last_title = coltext ":" last_title + + row = row " title=\"" last_title "\"" + row = row ">" last_value "\n" + + repeat = 1 + last_class = class + last_title = title + last_value = value + } + + ++statuscnts [fname, class] } - if (sum != 0) { - - print " " - print " " - print " " text "" - print extra_cell - print " " row + row = row " " last_value "" + + repeat = 0 + + if (0 < nfailures || nwarnings) { + + # increment only for components included in the output + ++rowinx + + dispname = get_dispname(section, compname) + + print " " + print " " compinx "" + print " " dispname "" + + if (2 == section) + print " " maxasserts "" + + print row + print " " + + return 1 + } + + return 0 } -function build_summary () +# prints a table for each of the three sections (examples, locales, +# and tests) +function print_section(section) { - if (verbose || compfails) { - print " " - print " " n "" - print " " - print " " dispname - print " " + # the name of this section ("example", "locale", or "test") + sectname = sectnames [section] - if (comptype == "test") { - print " " max_asserts "" - } + if (0 == sectmaxcompcnts [section]) { + print + print " " + print "

    No " sectname "s found in " logcount " logs

    " - print columns; - print " " + return } - if (0 > getline line < totalsfile) { - # the first time through there is no totalsfile - nfields = fileno + thead = " \n" + thead = thead " \n" + thead = thead " ###\n" + thead = thead " " + thead = thead sectname " name\n" + + if (2 == section) { + thead = thead " " + thead = thead "max
    asserts\n" } - else { - nfields = split(line, logcounts_prev) - getline line < totalsfile - split(line, logfails_prev) + row0 = "" + row1 = " \n" + row2 = " \n" + + colnos = "" + + # iterate over the array of section counts for each log file + # and compose the column headers for each log + for (i = 1; i <= logcount; ++i) { + + logname = logfnames [i] + + loggzfname = substr(logname, 1, index(logname, ".txt") - 1) ".gz.txt" + + colnos = colnos " " + colnos = colnos "" i "" + + buildtype = get_buildtype(logname) + buildmode = buildmodes [buildtype] + + row1 = row1 " " buildtype "\n" + + fulldate = logdates [logname] + date = get_date(fulldate) + time = get_time(fulldate) + + row2 = row2 " " date "\n" + } + + row0 = row0 colnos "\n \n" + row1 = row1 " \n" + row2 = row2 " \n" + + thead = thead row0 row1 row2 " " + + print " " + print "

    Results of " sectmaxcompcnts [section] " " \ + sectname "s from " logcount " logs

    " + print " " + + print thead + + print " " + + # one-based component index (of all found) + compinx = 0 + + # reset the arrays + split("", logcompwarns) + split("", logcompfails) + split("", statuscnts) + + # iterate over elements of the compcnts array using the section + # number and the name of the comoponent as the key (index) + + if (2 == section) + colspan = " colspan=2" + else + colspan = "" + + rowinx = 1 + + for (ci in compcnts) { + + # only process the specified section + if (section != substr(ci, 1, 1)) + continue + + # extract the name of the component from the key + compname = substr(ci, 3) + + # determine whether the current component should be included + # in output or not and if so, print it out + printed = print_component(section, compname) + + if (printed && (rowinx % 20) == 0) { + + print " " + print " " + print " " + print colnos + print " " + } + } + + print " " + + # print totals in the table footer + print " " + + ################################################################## + ### print column headers again + + print " " + print " " + print " " + print colnos + print " " + + ################################################################## + ### print totals for each interesting status (class) + print " " + print " " + print " status" + print " " + print " " + + for (si in states) { + + row = " \n" + row = row " \n" + row = row " \n" + + nfails = 0 + + # the number of times the same value consecutively repeats + repeat = 1 + last_value = "?" - getline line < totalsfile - split(line, assertcounts_prev) + for (i = 1; i <= logcount; ++i) { - getline line < totalsfile - split(line, buildfails_prev) + fname = logfnames [i] - getline line < totalsfile - split(line, diffcounts_prev) + if ((fname, si) in statuscnts) { - getline line < totalsfile - split(line, exitcounts_prev) + ++nfails + + value = statuscnts [fname, si] + } + else + value = "" + + if ("?" == last_value) + last_value = value + else if (value == last_value) + ++repeat + else { + row = row " \n" + + last_value = value + repeat = 1 + } + } - getline line < totalsfile - split(line, signalcounts_prev) + if (0 < nfails) { + row = row " \n" - close(totalsfile) + print row " " + } } - if (name == "@") { + ################################################################## + # print number of expected failures + row = "" + nfails = 0 + + # the number of times the same value consecutively repeats + repeat = 1 + last_value = "?" - # the special (bogus) name indicates a request to format - # totals from the totals file + for (i = 1; i <= logcount; ++i) { - if (comptype == "test") - extra_cell = " " + fname = logfnames [i] + + if ((section, fname) in xfailcounts) { + + ++nfails + + value = xfailcounts [section, fname] + } else - extra_cell = "" + value = "" - print " " - print " " - print " " - print " " - print extra_cell - - for (i = 1; i <= nfields; ++i) - print "" - - print " " - - # output the totals of components that failed to build - print_totals("COMP", "number of " comptype "s that failed to build", - "BUILD", buildfails_prev, nfields) - - # output the totals of examples that produced unexpected output - print_totals("DIFF", - "number of " comptype "s with unexpected output", - "DIFF", diffcounts_prev, nfields); - - # output the totals of components that had assertions - print_totals("ASSERT", - "number of " comptype "s with failed assertions", - "ASSERT", assertcounts_prev, nfields); - - # output the totals of components that exited with non-zero status - print_totals("EXIT", - "number of " comptype "s with non-zero exit status", - "EXIT", exitcounts_prev, nfields); - - # output the totals of components that exited with a signal - print_totals("SIGNAL", - "number of signalled " comptype "s", - "SIGNAL", signalcounts_prev, nfields); - - # output the totals of components that exited with a signal - print_totals("SIGNAL", - "number of " comptype "s that (likely) timed out", - "SIGHUP", sighupcounts_prev, nfields); - - # output the number if missing components - print_totals("MISSING", - "number of missing " comptype "s", - "N/A", missingcounts_prev, nfields); - - # output the totals of failed components - print_totals("header", - "number of " comptype "s with any failures", - "all failures", logfails_prev, nfields); - - # output the totals of all components - print_totals("header", - "total number of " comptype "s exercised", - "total exercised", logcounts_prev, nfields); + if ("?" == last_value) + last_value = value + else if (value == last_value) + ++repeat + else { + row = row " \n" + + last_value = value + repeat = 1 + } } - else { - # increment counts in the totals file for each component - # set the Output Record Separator to space - ORS=" " + if (0 < nfails) { + row = row " \n" - for (i = 1; i <= nfields; ++i) - print logfails [i] + logfails_prev [i] >> totalsfile + print " " + print " " + print " " + print row " " + } + + ################################################################## + # print expected/unexpected mismatches + row = "" + nfails = 0 + + # the number of times the same value consecutively repeats + repeat = 1 + last_value = "?" + + for (i = 1; i <= logcount; ++i) { - print "\n" >> totalsfile + fname = logfnames [i] + + if ((section, fname) in xmatchcounts) { + + ++nfails + + value = xmatchcounts [section, fname] + } + else + value = "" - for (i = 1; i <= nfields; ++i) - print assertcounts [i] + assertcounts_prev [i] >> totalsfile + if ("?" == last_value) + last_value = value + else if (value == last_value) + ++repeat + else { + row = row " \n" + + last_value = value + repeat = 1 + } + } - print "\n" >> totalsfile + if (0 < nfails) { + row = row " \n" - for (i = 1; i <= nfields; ++i) - print diffcounts [i] + diffcounts_prev [i] >> totalsfile + print " " + print " " + print " " + print row " " + } - print "\n" >> totalsfile + ################################################################## + # print total number of failures + row = "" + nfails = 0 - for (i = 1; i <= nfields; ++i) - print exitcounts [i] + exitcounts_prev [i] >> totalsfile + # the number of times the same value consecutively repeats + repeat = 1 + last_value = "?" - print "\n" >> totalsfile + for (i = 1; i <= logcount; ++i) { - for (i = 1; i <= nfields; ++i) - print signalcounts [i] + signalcounts_prev [i] >> totalsfile + fname = logfnames [i] - print "\n" >> totalsfile + if (fname in logcompfails) { - for (i = 1; i <= nfields; ++i) - print sighupcounts [i] + sighupcounts_prev [i] >> totalsfile + ++nfails - print "\n" >> totalsfile + value = logcompfails [fname] + } + else + value = "" - for (i = 1; i <= nfields; ++i) - print missingcounts [i] + missingcounts_prev [i] >> totalsfile + if ("?" == last_value) + last_value = value + else if (value == last_value) + ++repeat + else { + row = row " \n" - # append a newline to the file - # ORS="\n" - # print "" >> totalsfile - # close(totalsfile) + last_value = value + repeat = 1 + } } -} -function component_summary () { - print columns; -} + if (0 < nfails) { + row = row " \n" - # the component wasn't found in the last file processed - columns = columns "\n " + print " " + print " " + print " " + print row " " + } + + ################################################################## + # print total number of components exercised + row = "" + nfails = 0 + + # the number of times the same value consecutively repeats + repeat = 1 + last_value = "?" + + for (i = 1; i <= logcount; ++i) { + + fname = logfnames [i] + + if ((section, fname) in logcompcnts) { + + ++nfails + + value = logcompcnts [section, fname] } + else + value = "" - build_summary() + if ("?" == last_value) + last_value = value + else if (value == last_value) + ++repeat + else { + row = row " \n" + + last_value = value + repeat = 1 + } } - else { - component_summary() + + if (0 < nfails) { + row = row " \n" + + print " " + print " " + print " " + + print row " " + } + + ################################################################## + print " " + print "
    column number and log
    column number and log
    totals for status
    " si "" last_value "" last_value "
    totals for status
    " + if (1 < repeat) { + row = row " colspan=" repeat + row = row " title=\"columns " i - repeat " to " i - 1 "\"" + } + else { + row = row " title=\"column " i - 1 "\"" + } - close(totalsfile) - system("rm -f " totalsfile) + row = row ">" last_value " totalsfile + if (1 < repeat) { + row = row " colspan=" repeat + row = row " title=\"columns " i - repeat " to " i - 1 "\"" + } + else { + row = row " title=\"column " i - 1 "\"" + } - print "\n" >> totalsfile + row = row ">" last_value "
    expected failures
    " last_value "> totalsfile + if (1 < repeat) { + row = row " colspan=" repeat + row = row " title=\"columns " i - repeat " to " i - 1 "\"" + } + else { + row = row " title=\"column " i - 1 "\"" + } - print "\n" >> totalsfile + row = row ">" last_value "
    expected/actual mismatches
    > totalsfile + if (1 < repeat) { + row = row " colspan=" repeat + row = row " title=\"columns " i - repeat " to " i - 1 "\"" + } + else { + row = row " title=\"column " i - 1 "\"" + } - close(totalsfile) + row = row ">" last_value "" last_value "N/A
    failures
    " last_value "" last_value "
    total
    " +} + + +END { + + if (0 == bodyonly) { + print "" + print " " + print " " + print " " + print " " + } + + for (section = 1; section <= 3; ++section) + print_section(section) + + if (0 == bodyonly) { + print " " + print "" } } Added: incubator/stdcxx/trunk/etc/config/xfail.txt URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/etc/config/xfail.txt?rev=607788&view=auto ============================================================================== --- incubator/stdcxx/trunk/etc/config/xfail.txt (added) +++ incubator/stdcxx/trunk/etc/config/xfail.txt Mon Dec 31 17:21:34 2007 @@ -0,0 +1,44 @@ +######################################################################## +# +# Expected/known failures in stdcxx examples, locales, and tests. +# +# Record format: +# +# [ ]* +# +# where , , and are ordinary strings +# (containing no whitespace), and is a shell globbing +# pattern in the format below. All fields are required, as are all +# the components the field. +# +# ::= ---- +# +######################################################################## +# Known example failures +# +# EXAMPLE EXPECTED ISSUE +# NAME PLATFORM AND BUILD TYPE STATUS NUMBER +# --------------- ------------------------------ -------- ---------- +codecvt1 *-*-*-*-* 1 STDCXX-520 +dynatype *-*-*-vacpp-9.0-* COMP STDCXX-605 +limits aix-*-*-*-* DIFF STDCXX-458 + +######################################################################## +# Known locale failures +# +# LOCALE EXPECTED ISSUE +# NAME PLATFORM AND BUILD TYPE STATUS NUMBER +# -------------- ------------------------------ -------- ---------- +br_FR.ISO-8859-1 *.*.*.*.* 1 STDCXX-372 +hu_HU.ISO-8859-2 *.*.*.*.* 1 STDCXX-372 + + +######################################################################## +# Known test failures +# +# TEST EXPECTED ISSUE +# NAME PLATFORM AND BUILD TYPE STATUS NUMBER +# -------- ------------------------------ -------- ---------- +0.process aix-5.3-*-vacpp-9.0-* SEGV STDCXX-625 +2.smartptr.shared aix-*-*-vacpp-9.0-* COMP STDCXX-360 +19.exceptions.mt aix-5.3-*-vacpp-9.0-{12,15}? HUP STDCXX-644 Propchange: incubator/stdcxx/trunk/etc/config/xfail.txt ------------------------------------------------------------------------------ svn:eol-style = native Propchange: incubator/stdcxx/trunk/etc/config/xfail.txt ------------------------------------------------------------------------------ svn:keywords = Id