#! /bin/sh

# (C) 1998, 1999, 2000, 2002 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 -u $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.
cat ./config.status $files |
$AWK '
BEGIN {
  lang=""; configflags = "";
  address="gcc-testresults@gcc.gnu.org";
  version="gcc";
  print "cat <<'"'"'EOF'"'"' |";
'${prepend_logs+"  system(\"cat $prepend_logs\"); "}'
}
($0 ~ /^[^ ]*\/configure / || $0 ~ /^# [^ ]*\/configure /) &&
configflags == "" {
    configflags = $0 " ";
    sub(/^# /, "", configflags);
    srcdir = configflags;
    sub(/\/configure .*/, "", srcdir);
    printf "LAST_UPDATED: ";
    system("tail -1 " srcdir "/LAST_UPDATED");
    print "";

    sub(/^[^ ]*\/configure */, " ", 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 )/ { 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
