#! /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
