]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/cvs/contrib/debug_check_log.sh
This commit was generated by cvs2svn to compensate for changes in r171829,
[FreeBSD/FreeBSD.git] / contrib / cvs / contrib / debug_check_log.sh
1 #!/bin/sh
2
3 #
4 # This program is intended to take a check.log file generated by a failed run of
5 # sanity.sh as input and run expr line by line on it.  It seems a much easier
6 # way of spotting a single failed line in a 100 line test result.
7 #
8
9 #
10 # This script falls under the GNU General Public License and is intended to
11 # be distributed with CVS.
12 #
13
14 #
15 # No warranties, express or implied.
16 #
17
18 #
19 # Contributed by Derek R. Price <derek.price@openavenue.com>
20 #
21
22
23
24 usage ()
25 {
26         echo "\
27 usage: $0 [-afh] [file...]
28
29        -a          process alternate pattern
30        -f          process first pattern (default)
31        -h          print this text
32
33      file          files to process (default = check.log)"
34 }
35
36 # Do a line by line match with expr
37 #
38 # INPUTS
39 #    $1 = text file name
40 #    $2 = pattern file name
41 expr_line_by_line ()
42 {
43         dcl_line=0
44         dcl_wrong=
45         # We are assuming a newline at the end of the file.  The way sanity.sh
46         # uses echo to create the log message guarantees this newline and since
47         # expr ignores the last newline when the anchor is present anyhow, no
48         # information is being lost in the transition
49         while test $dcl_line -lt `wc -l <$1` -a $dcl_line -lt `wc -l <$2`; do
50                 dcl_line=`expr $dcl_line + 1`
51                 if test `sed -ne${dcl_line}p <$1 |wc -c` -eq 1 \
52                                 -a `sed -ne${dcl_line}p <$2 |wc -c` -eq 1; then
53                         # This is a workaround for what I am calling a bug in GNU
54                         # expr - it won't match the empty string to the empty
55                         # string.  In this case the assumption is that a single
56                         # character is always a newline.  Since we already checked
57                         # for the end of the file, we know sed will echo the
58                         # newline.
59                         : 
60                 elif expr "`sed -ne${dcl_line}p <$1`" : \
61                                 "`sed -ne${dcl_line}p <$2`\$" >/dev/null; then
62                         :
63                 else
64                         echo "$dcl_line: `sed -ne${dcl_line}p <$1`"
65                         echo "$dcl_line: `sed -ne${dcl_line}p <$2`\$"
66                         dcl_wrong="$dcl_wrong $dcl_line"
67                 fi
68         done
69         if test `wc -l <$1` -ne `wc -l <$2`; then
70                 echo "output & pattern contain differing number of lines"
71         elif test -z "$dcl_wrong"; then
72                 echo "no mismatched lines"
73         else
74                 echo "mismatched lines: $dcl_wrong"
75         fi
76 }
77
78 # Process a single check.log file
79 #
80 # INPUTS
81 #    $1 = filename
82 process_check_log ()
83 {
84         # abort if we can't find any expressions
85         if grep '^\*\* got: $' <$1 >/dev/null; then
86                 :
87         else
88                 echo "WARNING:  No expressions in file: $1" >&2
89                 echo "          Either not a check.log or sanity.sh exited for some other reason," >&2
90                 echo "          like bad exit status.  Try tail." >&2
91                 return
92         fi
93
94         dcl_exprfiles=""
95         if grep '^\*\* or: $' <$1 >/dev/null; then
96                 # file contains a second regex
97                 if test $dcl_dofirst -eq 1; then
98                         # get the first pattern
99                         sed -ne '/^\*\* expected: $/,/^\*\* or: $/p' <$1 >/tmp/dcle$$
100                         dcl_exprfiles="$dcl_exprfiles /tmp/dcle$$"
101                 fi
102                 if test $dcl_doalternate -eq 1; then
103                         # get the alternate pattern
104                         sed -ne '/^\*\* or: $/,/^\*\* got: $/p' <$1 >/tmp/dclo$$
105                         dcl_exprfiles="$dcl_exprfiles /tmp/dclo$$"
106                 else
107                         echo "WARNING:  Ignoring alternate pattern in file: $1" >&2
108                 fi
109         else
110                 # file doesn't contain a second regex
111                 if test $dcl_dofirst = 1; then
112                         # get the only pattern
113                         sed -ne '/^\*\* expected: $/,/^\*\* got: $/p' <$1 >/tmp/dcle$$
114                         dcl_exprfiles="$dcl_exprfiles /tmp/dcle$$"
115                 fi
116                 if test $dcl_doalternate -eq 1; then
117                         echo "WARNING:  No alternate pattern in file:  $1" >&2
118                 fi
119         fi
120
121         # and get the actual output
122         sed -ne '/^\*\* got: $/,$p' <$1 >/tmp/dclg$$
123         sed -ne '1D
124 $D
125 p' </tmp/dclg$$ >/tmp/dclh$$
126         mv /tmp/dclh$$ /tmp/dclg$$
127
128         # compare the output against each pattern requested
129         for dcl_f in $dcl_exprfiles; do
130                 sed -ne '1D
131 $D
132 p' <$dcl_f >/tmp/dclp$$
133                 mv /tmp/dclp$$ $dcl_f
134
135                 case $dcl_f in
136                         /tmp/dcle*)
137                                 echo "********** $1 : Primary **********"
138                                 ;;
139                         /tmp/dclo*)
140                                 echo "********** $1 : Alternate **********"
141                                 ;;
142                 esac
143
144                 expr_line_by_line /tmp/dclg$$ $dcl_f
145
146                 rm $dcl_f
147         done
148
149         rm /tmp/dclg$$
150 }
151
152 ###
153 ### MAIN
154 ###
155
156 # set up defaults
157 dcl_doalternate=0
158 dcl_dofirst=0
159
160 # process options
161 while getopts afh arg; do
162         case $arg in
163                 a)
164                         dcl_doalternate=1
165                         ;;
166                 f)
167                         dcl_dofirst=1
168                         ;;
169                 \?|h)
170                         usage
171                         exit 1
172                         ;;
173         esac
174 done
175
176 # dispose of processed args
177 shift `expr $OPTIND - 1`
178 OPTIND=1
179
180 # set the default mode
181 if test $dcl_doalternate -eq 0; then
182         dcl_dofirst=1
183 fi
184
185 # set default arg
186 if test $# -eq 0; then
187         if test -f src/check.log && test -r src/check.log; then
188                 set src/check.log
189         else
190                 set check.log
191         fi
192 fi
193
194 for file in "$@"; do
195         process_check_log $file;
196 done
197
198 exit 0