2 # Copyright (C) 2006, 2008 Free Software Foundation
4 # Analyze changes in GCC DejaGNU test logs for binutils, gcc, gdb, etc.
5 # Original version written in 2005 by James Lemke <jwlemke@wasabisystems.com>.
12 dg-cmp-results.sh [-v] [-v] [-v] <variant-name> <old-file> <new-file>
13 <variant-name> names the desired variant, "/" must be written as "\/".
14 Use the empty string ("") for the first variant in each file.
16 Non-verbose output is degradation info like PASS->FAIL.
17 -v adds improvement info like FAIL->PASS.
18 -v -v adds info like tests that are no longer run.
19 -v -v -v adds info for tests that have not changed status.
20 -v -v -v -v is used for debugging.
25 while test "$1" = "-v"; do
26 verbose
=`expr $verbose + 1`
30 if test $# -ne 3 ; then
35 if test ! -f "$2"; then
36 echo "unable to open $2" >&2
40 if test ! -f "$3"; then
41 echo "unable to open $3" >&2
45 # Command differences for various platforms.
55 # sections are identified by separator lines beginning with '\t\t==='.
56 # section 0 identifies run date, target, and host.
57 # section 1 and subsequent contain test data for a target variant.
58 # -skip to /^Running target/ and use that line to identify the variant.
59 # -subsequent lines contain the result data. They begin with:
60 # '(PASS|FAIL|XFAIL|XPASS|UNTESTED|UNSUPPORTED|UNRESOLVED):'
66 TMPDIR
=${TMPDIR:-/tmp}
68 echo "dg-cmp-results.sh: Verbosity is ${verbose}, Variant is \"${VARIANT}\""
71 header
="^Running target $VARIANT"
73 temp
=`grep "$header" $OFILE`
74 if test -z "$temp"; then
75 echo "Error: variant \"$VARIANT\" not found in $OFILE."
78 temp
=`grep "$header" $NFILE`
79 if test -z "$temp"; then
80 echo "Error: variant \"$VARIANT\" not found in $NFILE."
85 # Copy out the old file's section 0.
86 echo "Older log file: $OFILE"
87 sed $E -e '/^[[:space:]]+===/,$d' $OFILE
89 # Copy out the new file's section 0.
90 echo "Newer log file: $NFILE"
91 sed $E -e '/^[[:space:]]+===/,$d' $NFILE
93 # Create a temporary file from the old file's interesting section.
94 sed $E -e "/$header/,/^[[:space:]]+===.*Summary ===/!d" \
96 -e '/^(WARNING|ERROR):/d' \
100 sort -s -t : -k 3b
- \
103 # Create a temporary file from the new file's interesting section.
104 sed $E -e "/$header/,/^[[:space:]]+===.*Summary ===/!d" \
106 -e '/^(WARNING|ERROR):/d' \
110 sort -s -t : -k 3b
- \
113 # Merge the two files, then compare adjacent lines.
114 # Comparison is complicated by tests that may be run multiple times.
115 # If that case, we assume that the order is the same in both files.
116 cat <<EOF >compare-$$.awk
119 queue1 = 1; queueN = 0; status[queue1] = ""; name[queue1] = ""
120 verbose = verbose + 0 # Make sure it's defined.
123 # FIFO circular queue
124 function push(st, nm) {
125 queueN += 1; status[queueN] = st; name[queueN] = nm
129 if (queueN >= queue1) result = queue1
134 if (queue1 > queueN) { queue1 = 1; queueN = 0; }
137 function compare(st, nm) {
140 # This new test wasn't run last time.
141 if(st == "FAIL" || st == "UNRESOLVED" || verbose >= 2) {
142 # New test fails or we want all changes
143 printf("NA->%s:%s\n", st, nm)
147 # Compare this new test to the first queued old one.
149 printf("Comparing two lines:\n O:%s:%s\n N:%s:%s\n",
150 status[old], name[old], st, nm)
152 if (name[old] != nm) {
153 # The old test wasn't run this time and
154 # the new test wasn't run last time.
156 printf("%s->NA:%s\n", status[old], name[old])
157 if (nm != "") printf("NA->%s:%s\n", st, nm)
163 if (status[old] == st) {
164 # Status of this test has not changed.
165 if (verbose >= 3) printf("%s:%s\n", st, nm)
167 else if(status[old] == "PASS" && st == "XFAIL") {
168 if (verbose >= 1) notable = 1
170 else if(status[old] == "PASS" || st == "FAIL") {
171 # Test did pass but doesn't now
172 # or didn't fail but does now.
175 else if(st == "PASS") {
176 # Test didn't pass but does now.
177 if (verbose >= 1) notable = 1
179 else if(verbose >= 2) {
180 # Miscellaneous status change.
183 if (notable > 0) printf("%s->%s:%s\n", status[old], st, nm)
190 while (old = peek()) {
191 if (name[old] == \$3) break;
192 # The queued test is no longer run.
195 # Save this test for later comparison.
204 while (old = peek()) compare("", "")
207 sort -m -s -t : -k 3b
$TMPDIR/o$$
-$OBASE $TMPDIR/n$$
-$NBASE |
208 awk -v verbose
=$verbose -f compare-$$.
awk /dev
/stdin
210 # Delete the temporary files.
211 rm -f compare-$$.
awk $TMPDIR/o$$
-$OBASE $TMPDIR/n$$
-$NBASE