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