comparison contrib/dg-cmp-results.sh @ 0:a06113de4d67

first commit
author kent <kent@cr.ie.u-ryukyu.ac.jp>
date Fri, 17 Jul 2009 14:47:48 +0900
parents
children 04ced10e8804
comparison
equal deleted inserted replaced
-1:000000000000 0:a06113de4d67
1 #!/bin/bash
2 # Copyright (C) 2006, 2008 Free Software Foundation
3 #
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>.
6 #
7 # See usage() below.
8
9 usage () {
10 cat <<EOF >&2
11 Usage:
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.
15 Output is to stdout.
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.
21 EOF
22 }
23
24 verbose=0
25 while test "$1" = "-v"; do
26 verbose=`expr $verbose + 1`
27 shift
28 done
29
30 if test $# -ne 3 ; then
31 usage
32 exit 1
33 fi
34
35 if test ! -f "$2"; then
36 echo "unable to open $2" >&2
37 exit 1
38 fi
39
40 if test ! -f "$3"; then
41 echo "unable to open $3" >&2
42 exit 1
43 fi
44
45 # Command differences for various platforms.
46 case `uname -s` in
47 Darwin|NetBSD)
48 E=-E # sed
49 ;;
50 *)
51 E=-r # sed
52 ;;
53 esac
54
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):'
61 VARIANT="$1"
62 OFILE="$2"
63 OBASE=`basename "$2"`
64 NFILE="$3"
65 NBASE=`basename "$3"`
66
67 echo "dg-cmp-results.sh: Verbosity is ${verbose}, Variant is \"${VARIANT}\""
68 echo
69
70 header="^Running target $VARIANT"
71
72 temp=`grep "$header" $OFILE`
73 if test -z "$temp"; then
74 echo "Error: variant \"$VARIANT\" not found in $OFILE."
75 exit 1
76 fi
77 temp=`grep "$header" $NFILE`
78 if test -z "$temp"; then
79 echo "Error: variant \"$VARIANT\" not found in $NFILE."
80 exit 1
81 fi
82 unset temp
83
84 # Copy out the old file's section 0.
85 echo "Older log file: $OFILE"
86 sed $E -e '/^[[:space:]]+===/,$d' $OFILE
87
88 # Copy out the new file's section 0.
89 echo "Newer log file: $NFILE"
90 sed $E -e '/^[[:space:]]+===/,$d' $NFILE
91
92 # Create a temporary file from the old file's interesting section.
93 sed $E -e "1,/$header/d" \
94 -e '/^[[:space:]]+===/,$d' \
95 -e '/^[A-Z]+:/!d' \
96 -e '/^(WARNING|ERROR):/d' \
97 -e 's/\r$//' \
98 -e 's/^/O:/' \
99 $OFILE |
100 sort -s -t : -k 3b - \
101 >/tmp/o$$-$OBASE
102
103 # Create a temporary file from the new file's interesting section.
104 sed $E -e "1,/$header/d" \
105 -e '/^[[:space:]]+===/,$d' \
106 -e '/^[A-Z]+:/!d' \
107 -e '/^(WARNING|ERROR):/d' \
108 -e 's/\r$//' \
109 -e 's/^/N:/' \
110 $NFILE |
111 sort -s -t : -k 3b - \
112 >/tmp/n$$-$NBASE
113
114 # Merge the two files, then compare adjacent lines.
115 # Comparison is complicated by tests that may be run multiple times.
116 # If that case, we assume that the order is the same in both files.
117 cat <<EOF >compare-$$.awk
118 BEGIN {
119 FS = ":"
120 queue1 = 1; queueN = 0; status[queue1] = ""; name[queue1] = ""
121 verbose = verbose + 0 # Make sure it's defined.
122 }
123
124 # FIFO circular queue
125 function push(st, nm) {
126 queueN += 1; status[queueN] = st; name[queueN] = nm
127 }
128 function peek() {
129 result = 0
130 if (queueN >= queue1) result = queue1
131 return result
132 }
133 function drop() {
134 queue1 += 1
135 if (queue1 > queueN) { queue1 = 1; queueN = 0; }
136 }
137
138 function compare(st, nm) {
139 old = peek()
140 if (old == 0) {
141 # This new test wasn't run last time.
142 if (verbose >= 2) printf("NA->%s:%s\n", st, nm)
143 }
144 else {
145 # Compare this new test to the first queued old one.
146 if (verbose >= 4) {
147 printf("Comparing two lines:\n O:%s:%s\n N:%s:%s\n",
148 status[old], name[old], st, nm)
149 }
150 if (name[old] != nm) {
151 # The old test wasn't run this time and
152 # the new test wasn't run last time.
153 if (verbose >= 2) {
154 printf("%s->NA:%s\n", status[old], name[old])
155 if (nm != "") printf("NA->%s:%s\n", st, nm)
156 }
157 drop()
158 }
159 else {
160 notable = 0
161 if (status[old] == st) {
162 # Status of this test has not changed.
163 if (verbose >= 3) printf("%s:%s\n", st, nm)
164 }
165 else if(status[old] == "PASS" && st == "XFAIL") {
166 if (verbose >= 1) notable = 1
167 }
168 else if(status[old] == "PASS" || st == "FAIL") {
169 # Test did pass but doesn't now
170 # or didn't fail but does now.
171 notable = 1
172 }
173 else if(st == "PASS") {
174 # Test didn't pass but does now.
175 if (verbose >= 1) notable = 1
176 }
177 else if(verbose >= 2) {
178 # Miscellaneous status change.
179 notable = 1
180 }
181 if (notable > 0) printf("%s->%s:%s\n", status[old], st, nm)
182 drop()
183 }
184 }
185 }
186
187 /^O:/ {
188 while (old = peek()) {
189 if (name[old] == \$3) break;
190 # The queued test is no longer run.
191 compare("", "");
192 }
193 # Save this test for later comparison.
194 push(\$2, \$3)
195 }
196
197 /^N:/ {
198 compare(\$2, \$3)
199 }
200
201 END {
202 while (old = peek()) compare("", "")
203 }
204 EOF
205 sort -m -s -t : -k 3b /tmp/o$$-$OBASE /tmp/n$$-$NBASE |
206 awk -v verbose=$verbose -f compare-$$.awk /dev/stdin
207
208 # Delete the temporary files.
209 rm -f compare-$$.awk /tmp/o$$-$OBASE /tmp/n$$-$NBASE
210
211 exit 0