summaryrefslogtreecommitdiff
path: root/contrib/test_summary
blob: 5760b053ec2720c0e750d0ef6d7438d645107855 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#! /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