| #! /bin/sh | 
 |  | 
 | # (C) 1998, 1999, 2000, 2002, 2003, 2004, 2007, 2009, 2010 | 
 | # Free Software Foundation | 
 | # Originally by Alexandre Oliva <oliva@dcc.unicamp.br> | 
 |  | 
 | # This script is Free Software, and it can be copied, distributed and | 
 | # modified as defined in the GNU General Public License.  A copy of | 
 | # its license can be downloaded from http://www.gnu.org/copyleft/gpl.html | 
 |  | 
 | # This script processes *.{sum,log} files, producing a shell-script | 
 | # that sends e-mail to the appropriate lists and renames files to | 
 | # *.sent.  It currently handles only gcc, but it should be quite easy | 
 | # to modify it to handle other packages and its mailing lists. | 
 |  | 
 | # The scripts assumes it is run in the root directory of the build | 
 | # tree, and it will include all .sum files it finds in the mail | 
 | # report. | 
 |  | 
 | # configure flags are extracted from ./config.status | 
 |  | 
 | # if the BOOT_CFLAGS environment variable is set, it will be included | 
 | # in the mail report too. | 
 |  | 
 | # The usage pattern of this script is as follows: | 
 |  | 
 | # test_summary | more   # so as to observe what should be done | 
 |  | 
 | # test_summary | sh     # so as to actually send e-mail and move log files | 
 |  | 
 | # It accepts a few command line arguments.  For example: | 
 | if test x"$1" = "x-h"; then | 
 |   cat <<_EOF | 
 |  -o: re-reads logs that have been mailed already (.sum.sent) | 
 |  -t: prevents logs from being renamed | 
 |  -p: prepend specified file (or list of files: -p "a b") to the report | 
 |  -i: append specified file (or list of files: -i "a b") to the report | 
 |  -m: specify the e-mail address to send notes to.  An appropriate default | 
 |      should be selected from the log files. | 
 |  -f: force reports to be mailed; if omitted, only reports that differ | 
 |      from the sent.* version are sent. | 
 | _EOF | 
 |   exit 0 | 
 | fi | 
 |  | 
 | # Find a good awk. | 
 | if test -z "$AWK" ; then | 
 |   for AWK in gawk nawk awk ; do | 
 |     if type $AWK 2>&1 | grep 'not found' > /dev/null 2>&1 ; then | 
 |       : | 
 |     else | 
 |       break | 
 |     fi | 
 |   done | 
 | fi | 
 |  | 
 | : ${filesuffix=}; export filesuffix | 
 | : ${move=true}; export move | 
 | : ${forcemail=false}; export forcemail | 
 | while true; do | 
 |     case "$1" in  | 
 |       -o) filesuffix=.sent; move=false; : ${mailto=nobody}; shift;; | 
 |       -t) move=false; shift;; | 
 |       -p) prepend_logs=${prepend_logs+"$prepend_logs "}"$2"; shift 2;; | 
 |       -i) append_logs=${append_logs+"$append_logs "}"$2"; shift 2;; | 
 |       -m) mailto=$2; forcemail=true; shift 2;; | 
 |       -f) unset mailto; forcemail=true; shift;; | 
 |       *) break;; | 
 |     esac | 
 | done | 
 | : ${mailto="\" address \""}; export mailto | 
 | files=`find . -name \*.sum$filesuffix -print | sort` | 
 | anyfile=false anychange=$forcemail && | 
 | for file in $files; do | 
 |     [ -f $file ] && | 
 |     anyfile=true && | 
 |     { $anychange || | 
 |       anychange=`diff $file.sent $file 2>/dev/null | | 
 | 	if test ! -f $file.sent || | 
 | 	   egrep '^[<>] (XPASS|FAIL)' >/dev/null; then | 
 | 	    echo true | 
 | 	else | 
 | 	    echo false | 
 | 	fi | 
 |       ` | 
 |     } | 
 |     true | 
 | done && | 
 | $anyfile && | 
 | if $forcemail || $anychange; then :; else mailto=nobody; fi && | 
 | # We use cat instead of listing the files as arguments to AWK because | 
 | # GNU awk 3.0.0 would break if any of the filenames contained `=' and | 
 | # was preceded by an invalid ``variable'' name. | 
 | ( echo @TOPLEVEL_CONFIGURE_ARGUMENTS@ | ./config.status --file=-; cat $files ) | | 
 | $AWK ' | 
 | BEGIN { | 
 |   lang=""; configflags = ""; | 
 |   address="gcc-testresults@gcc.gnu.org"; | 
 |   version="gcc"; | 
 |   print "cat <<'"'"'EOF'"'"' |"; | 
 | '${prepend_logs+"  system(\"cat $prepend_logs\"); "}' | 
 | } | 
 | NR == 1 { | 
 |     configflags = $0 " "; | 
 |     srcdir = configflags; | 
 |     sub(/\/configure\047? .*/, "", srcdir); | 
 |     sub(/^\047/, "", srcdir); | 
 |     if ( system("test -f " srcdir "/LAST_UPDATED") == 0 ) { | 
 |         printf "LAST_UPDATED: "; | 
 |         system("tail -1 " srcdir "/LAST_UPDATED"); | 
 |         print ""; | 
 |     } | 
 |  | 
 |     sub(/^[^ ]*\/configure\047? */, " ", configflags); | 
 |     sub(/,;t t $/, " ", configflags); | 
 |     sub(/ --with-gcc-version-trigger=[^ ]* /, " ", configflags); | 
 |     sub(/ --norecursion /, " ", configflags); | 
 |     sub(/ $/, "", configflags); | 
 |     sub(/^ *$/, " none", configflags); | 
 |     configflags = "configure flags:" configflags; | 
 | } | 
 | /^Running target / { print ""; print; } | 
 | /^Target / { if (host != "") next; else host = $3; } | 
 | /^Host / && host ~ /^unix\{.*\}$/ { host = $3 " " substr(host, 5); } | 
 | /^Native / { if (host != "") next; else host = $4; } | 
 | /^[ 	]*=== [^ 	]+ tests ===/ { | 
 |   if (lang == "") lang = " "$2" "; else lang = " "; | 
 | } | 
 | $2 == "version" { save = $0; $1 = ""; $2 = ""; version = $0; gsub(/^ */, "", version); gsub(/\r$/, "", version); $0 = save; } | 
 | /===.*Summary/ { print ""; print; blanks=1; } | 
 | /tests ===/ || /^(Target|Host|Native)/ || $2 == "version" { print; blanks=1; } | 
 | /^(XPASS|FAIL|UNRESOLVED|WARNING|ERROR|# of )/ { sub ("\r", ""); print; } | 
 | /^using:/ { print ""; print; print ""; } | 
 | # dumpall != 0 && /^X?(PASS|FAIL|UNTESTED)|^testcase/ { dumpall=0; } | 
 | # dumpall != 0 { print; } | 
 | # /^FAIL/ { dumpall=1; } | 
 | /^$/ && blanks>0 { print; --blanks; } | 
 | END { if (lang != "") { | 
 |   print ""; | 
 |   print "Compiler version: " prefix version lang; | 
 |   print "Platform: " host; | 
 |   print configflags; | 
 |   '${BOOT_CFLAGS+'print "BOOT_CFLAGS='"${BOOT_CFLAGS}"'";'}' | 
 |   if (boot_cflags != 0) print boot_cflags; | 
 | '${append_logs+"  system(\"cat $append_logs\"); "}' | 
 |   print "EOF"; | 
 |   print "Mail -s \"Results for " prefix version lang "testsuite on " host "\" '"${mailto}"' &&"; | 
 | }} | 
 | { next; } | 
 | ' | sed "s/\([\`\$\\\\]\)/\\\\\\1/g" && | 
 | if $move; then | 
 |     for file in $files `ls -1 $files | sed s/sum$/log/`; do | 
 |       [ -f $file ] && echo "mv `${PWDCMD-pwd}`/$file `${PWDCMD-pwd}`/$file.sent &&" | 
 |     done | 
 | fi && | 
 | echo true | 
 | exit 0 |