181404Speter#!/bin/sh 281404Speter 3175261Sobrien# Copyright (C) 2000-2005 The Free Software Foundation, Inc. 4175261Sobrien 5175261Sobrien# This program is free software; you can redistribute it and/or modify 6175261Sobrien# it under the terms of the GNU General Public License as published by 7175261Sobrien# the Free Software Foundation; either version 2, or (at your option) 8175261Sobrien# any later version. 981404Speter# 10175261Sobrien# This program is distributed in the hope that it will be useful, 11175261Sobrien# but WITHOUT ANY WARRANTY; without even the implied warranty of 12175261Sobrien# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13175261Sobrien# GNU General Public License for more details. 14175261Sobrien 15175261Sobrien# 1681404Speter# This program is intended to take a check.log file generated by a failed run of 1781404Speter# sanity.sh as input and run expr line by line on it. It seems a much easier 1881404Speter# way of spotting a single failed line in a 100 line test result. 1981404Speter# 2081404Speter 2181404Speter# 2281404Speter# Contributed by Derek R. Price <derek.price@openavenue.com> 2381404Speter# 2481404Speter 2581404Speter 2681404Speter 2781404Speterusage () 2881404Speter{ 2981404Speter echo "\ 3081404Speterusage: $0 [-afh] [file...] 3181404Speter 3281404Speter -a process alternate pattern 3381404Speter -f process first pattern (default) 3481404Speter -h print this text 3581404Speter 3681404Speter file files to process (default = check.log)" 3781404Speter} 3881404Speter 3981404Speter# Do a line by line match with expr 4081404Speter# 4181404Speter# INPUTS 4281404Speter# $1 = text file name 4381404Speter# $2 = pattern file name 4481404Speterexpr_line_by_line () 4581404Speter{ 4681404Speter dcl_line=0 4781404Speter dcl_wrong= 4881404Speter # We are assuming a newline at the end of the file. The way sanity.sh 4981404Speter # uses echo to create the log message guarantees this newline and since 5081404Speter # expr ignores the last newline when the anchor is present anyhow, no 5181404Speter # information is being lost in the transition 5281404Speter while test $dcl_line -lt `wc -l <$1` -a $dcl_line -lt `wc -l <$2`; do 5381404Speter dcl_line=`expr $dcl_line + 1` 5481404Speter if test `sed -ne${dcl_line}p <$1 |wc -c` -eq 1 \ 5581404Speter -a `sed -ne${dcl_line}p <$2 |wc -c` -eq 1; then 5681404Speter # This is a workaround for what I am calling a bug in GNU 5781404Speter # expr - it won't match the empty string to the empty 5881404Speter # string. In this case the assumption is that a single 5981404Speter # character is always a newline. Since we already checked 6081404Speter # for the end of the file, we know sed will echo the 6181404Speter # newline. 6281404Speter : 6381404Speter elif expr "`sed -ne${dcl_line}p <$1`" : \ 6481404Speter "`sed -ne${dcl_line}p <$2`\$" >/dev/null; then 6581404Speter : 6681404Speter else 6781404Speter echo "$dcl_line: `sed -ne${dcl_line}p <$1`" 6881404Speter echo "$dcl_line: `sed -ne${dcl_line}p <$2`\$" 6981404Speter dcl_wrong="$dcl_wrong $dcl_line" 7081404Speter fi 7181404Speter done 7281404Speter if test `wc -l <$1` -ne `wc -l <$2`; then 7381404Speter echo "output & pattern contain differing number of lines" 7481404Speter elif test -z "$dcl_wrong"; then 7581404Speter echo "no mismatched lines" 7681404Speter else 7781404Speter echo "mismatched lines: $dcl_wrong" 7881404Speter fi 7981404Speter} 8081404Speter 8181404Speter# Process a single check.log file 8281404Speter# 8381404Speter# INPUTS 8481404Speter# $1 = filename 8581404Speterprocess_check_log () 8681404Speter{ 8781404Speter # abort if we can't find any expressions 8881404Speter if grep '^\*\* got: $' <$1 >/dev/null; then 8981404Speter : 9081404Speter else 9181404Speter echo "WARNING: No expressions in file: $1" >&2 9281404Speter echo " Either not a check.log or sanity.sh exited for some other reason," >&2 9381404Speter echo " like bad exit status. Try tail." >&2 9481404Speter return 9581404Speter fi 9681404Speter 9781404Speter dcl_exprfiles="" 9881404Speter if grep '^\*\* or: $' <$1 >/dev/null; then 9981404Speter # file contains a second regex 10081404Speter if test $dcl_dofirst -eq 1; then 10181404Speter # get the first pattern 10281404Speter sed -ne '/^\*\* expected: $/,/^\*\* or: $/p' <$1 >/tmp/dcle$$ 10381404Speter dcl_exprfiles="$dcl_exprfiles /tmp/dcle$$" 10481404Speter fi 10581404Speter if test $dcl_doalternate -eq 1; then 10681404Speter # get the alternate pattern 10781404Speter sed -ne '/^\*\* or: $/,/^\*\* got: $/p' <$1 >/tmp/dclo$$ 10881404Speter dcl_exprfiles="$dcl_exprfiles /tmp/dclo$$" 10981404Speter else 11081404Speter echo "WARNING: Ignoring alternate pattern in file: $1" >&2 11181404Speter fi 11281404Speter else 11381404Speter # file doesn't contain a second regex 11481404Speter if test $dcl_dofirst = 1; then 11581404Speter # get the only pattern 11681404Speter sed -ne '/^\*\* expected: $/,/^\*\* got: $/p' <$1 >/tmp/dcle$$ 11781404Speter dcl_exprfiles="$dcl_exprfiles /tmp/dcle$$" 11881404Speter fi 11981404Speter if test $dcl_doalternate -eq 1; then 12081404Speter echo "WARNING: No alternate pattern in file: $1" >&2 12181404Speter fi 12281404Speter fi 12381404Speter 12481404Speter # and get the actual output 12581404Speter sed -ne '/^\*\* got: $/,$p' <$1 >/tmp/dclg$$ 12681404Speter sed -ne '1D 12781404Speter$D 12881404Speterp' </tmp/dclg$$ >/tmp/dclh$$ 12981404Speter mv /tmp/dclh$$ /tmp/dclg$$ 13081404Speter 13181404Speter # compare the output against each pattern requested 13281404Speter for dcl_f in $dcl_exprfiles; do 13381404Speter sed -ne '1D 13481404Speter$D 13581404Speterp' <$dcl_f >/tmp/dclp$$ 13681404Speter mv /tmp/dclp$$ $dcl_f 13781404Speter 13881404Speter case $dcl_f in 13981404Speter /tmp/dcle*) 14081404Speter echo "********** $1 : Primary **********" 14181404Speter ;; 14281404Speter /tmp/dclo*) 14381404Speter echo "********** $1 : Alternate **********" 14481404Speter ;; 14581404Speter esac 14681404Speter 14781404Speter expr_line_by_line /tmp/dclg$$ $dcl_f 14881404Speter 14981404Speter rm $dcl_f 15081404Speter done 15181404Speter 15281404Speter rm /tmp/dclg$$ 15381404Speter} 15481404Speter 15581404Speter### 15681404Speter### MAIN 15781404Speter### 15881404Speter 15981404Speter# set up defaults 16081404Speterdcl_doalternate=0 16181404Speterdcl_dofirst=0 16281404Speter 16381404Speter# process options 16481404Speterwhile getopts afh arg; do 16581404Speter case $arg in 16681404Speter a) 16781404Speter dcl_doalternate=1 16881404Speter ;; 16981404Speter f) 17081404Speter dcl_dofirst=1 17181404Speter ;; 17281404Speter \?|h) 17381404Speter usage 17481404Speter exit 1 17581404Speter ;; 17681404Speter esac 17781404Speterdone 17881404Speter 17981404Speter# dispose of processed args 18081404Spetershift `expr $OPTIND - 1` 18181404SpeterOPTIND=1 18281404Speter 18381404Speter# set the default mode 18481404Speterif test $dcl_doalternate -eq 0; then 18581404Speter dcl_dofirst=1 18681404Speterfi 18781404Speter 18881404Speter# set default arg 18981404Speterif test $# -eq 0; then 190107484Speter if test -f src/check.log && test -r src/check.log; then 191107484Speter set src/check.log 192107484Speter else 193107484Speter set check.log 194107484Speter fi 19581404Speterfi 19681404Speter 197107484Speterfor file in "$@"; do 198107484Speter process_check_log $file; 19981404Speterdone 20081404Speter 20181404Speterexit 0 202