##/bin/bash 
#
# Copyright (c) 2000-2005 Silicon Graphics, Inc.  All Rights Reserved.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it would be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write the Free Software Foundation,
# Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
#
#
# common procedures for QA scripts
#
# $Header: /disk7/depot/linux/pcp/dev/qa/RCS/common,v 2.52 2000/04/05 18:24:51 kenmcd Exp $
#

_setenvironment()
{
    MSGVERB="text:action"
    export MSGVERB
}

here=`pwd`
rm -f $here/$iam.out
_setenvironment

check=${check-true}

diff="diff -u"
verbose=false
group=false
xgroup=false
showme=false
sortme=false
expunge=true
have_test_arg=false
randomize=false
rm -f $tmp.list $tmp.tmp $tmp.sed

# Autodetect fs type based on what's on $TEST_DEV
if [ "$HOSTOS" == "Linux" ]
then
    export FSTYP=`blkid -c /dev/null -s TYPE -o value $TEST_DEV`
else
    export FSTYP=xfs
fi

for r
do

    if $group
    then
	# arg after -g
       group_list=$(sed -n < group \
                       -e 's/#.*//' \
                       -e 's/$/ /' \
                       -e "/^[0-9][0-9][0-9].* $r /"'{ s/ .*//p }')
	if [ -z "$group_list" ]
	then
	    echo "Group \"$r\" is empty or not defined?"
	    exit 1
	fi
	[ ! -s $tmp.list ] && touch $tmp.list
	for t in $group_list
	do
	    if grep -s "^$t\$" $tmp.list >/dev/null
	    then
		:
	    else
		echo "$t" >>$tmp.list
	    fi
	done
	group=false
	continue

    elif $xgroup
    then
	# arg after -x
	[ ! -s $tmp.list ] && ls [0-9][0-9][0-9] [0-9][0-9][0-9][0-9] >$tmp.list 2>/dev/null
	group_list=`sed -n <group -e 's/$/ /' -e "/^[0-9][0-9][0-9].* $r /"'{
s/ .*//p
}'`
	if [ -z "$group_list" ]
	then
	    echo "Group \"$r\" is empty or not defined?"
	    exit 1
	fi
	numsed=0
	rm -f $tmp.sed
	for t in $group_list
	do
	    if [ $numsed -gt 100 ]
	    then
		sed -f $tmp.sed <$tmp.list >$tmp.tmp
		mv $tmp.tmp $tmp.list
		numsed=0
		rm -f $tmp.sed
	    fi
	    echo "/^$t\$/d" >>$tmp.sed
	    numsed=`expr $numsed + 1`
	done
	sed -f $tmp.sed <$tmp.list >$tmp.tmp
	mv $tmp.tmp $tmp.list
	xgroup=false
	continue
    fi

    xpand=true
    case "$r"
    in

	-\? | -h | --help)	# usage
	    echo "Usage: $0 [options] [testlist]"'

common options
    -v			verbose

check options
    -xfs                test XFS (default)
    -udf                test UDF
    -nfs                test NFS
    -l			line mode diff
    -xdiff		graphical mode diff
    -udiff		show unified diff (default)
    -n			show me, do not run tests
    -q			quick [deprecated]
    -T			output timestamps
    -r 			randomize test order
    
testlist options
    -g group[,group...]	include tests from these groups
    -x group[,group...]	exclude tests from these groups
    NNN			include test NNN
    NNN-NNN		include test range (eg. 012-021)
'
	    exit 0
	    ;;

	-udf)	# -udf ... set FSTYP to udf
	    FSTYP=udf
	    xpand=false
	    ;;

	-xfs)	# -xfs ... set FSTYP to xfs
	    FSTYP=xfs
	    xpand=false
	    ;;

	-nfs)	# -nfs ... set FSTYP to nfs
	    FSTYP=nfs
	    xpand=false
	    ;;

	-g)	# -g group ... pick from group file
	    group=true
	    xpand=false
	    ;;

	-l)	# line mode for diff, was default before
	    diff="diff"
	    xpand=false
	    ;;

	-xdiff)	# graphical diff mode
	    xpand=false

	    if [ ! -z "$DISPLAY" ]
	    then
		which xdiff >/dev/null 2>&1 && diff=xdiff
		which gdiff >/dev/null 2>&1 && diff=gdiff
		which tkdiff >/dev/null 2>&1 && diff=tkdiff
		which xxdiff >/dev/null 2>&1 && diff=xxdiff
	    fi
	    ;;

	-udiff) # show a unified diff, default now, keep for backward compat
	    xpand=false
	    diff="$diff -u"
	    ;;

	-q)	# "quick", no longer used - always quick :-)
	    xpand=false
	    ;;

	-n)	# show me, don't do it
	    showme=true
	    xpand=false
	    ;;
        -r)	# randomize test order
	    randomize=true
	    xpand=false
	    ;;

	-T)	# turn on timestamp output
	    timestamp=true
	    xpand=false
	    ;;

	-v)
	    verbose=true
	    xpand=false
	    ;;
	-x)	# -x group ... exclude from group file
	    xgroup=true
	    xpand=false
	    ;;
	'[0-9][0-9][0-9] [0-9][0-9][0-9][0-9]')
	    echo "No tests?"
	    status=1
	    exit $status
	    ;;

	[0-9]*-[0-9]*)
	    eval `echo $r | sed -e 's/^/start=/' -e 's/-/ end=/'`
	    ;;

	[0-9]*-)
	    eval `echo $r | sed -e 's/^/start=/' -e 's/-//'`
	    end=`echo [0-9][0-9][0-9] [0-9][0-9][0-9][0-9] | sed -e 's/\[0-9]//g' -e 's/  *$//' -e 's/.* //'`
	    if [ -z "$end" ]
	    then
		echo "No tests in range \"$r\"?"
		status=1
		exit $status
	    fi
	    ;;

	*)
	    start=$r
	    end=$r
	    ;;

    esac

    # get rid of leading 0s as can be interpreted as octal
    start=`echo $start | sed 's/^0*//'`
    end=`echo $end | sed 's/^0*//'`

    if $xpand
    then
	have_test_arg=true
	$AWK_PROG </dev/null '
BEGIN	{ for (t='$start'; t<='$end'; t++) printf "%03d\n",t }' \
	| while read id
	do
	    if grep -s "^$id " group >/dev/null
	    then
		# in group file ... OK
		echo $id >>$tmp.list
	    else
		if [ -f expunged ] && $expunge && egrep "^$id([ 	]|\$)" expunged >/dev/null
		then
		    # expunged ... will be reported, but not run, later
		    echo $id >>$tmp.list
		else
		    # oops
		    echo "$id - unknown test, ignored"
		fi
	    fi
	done
    fi

done

if [ -s $tmp.list ]
then
    # found some valid test numbers ... this is good
    :
else
    if $have_test_arg
    then
	# had test numbers, but none in group file ... do nothing
	touch $tmp.list
    else
	# no test numbers, do everything from group file
	sed -n -e '/^[0-9][0-9][0-9]*/s/[ 	].*//p' <group >$tmp.list
    fi
fi

# should be sort -n, but this did not work for Linux when this
# was ported from IRIX
#
list=`sort $tmp.list`
rm -f $tmp.list $tmp.tmp $tmp.sed

if $randomize
then
    list=`echo $list | awk -f randomize.awk`
fi

case "$FSTYP" in
    xfs)
	 [ "$XFS_LOGPRINT_PROG" = "" ] && _fatal "xfs_logprint not found"
	 [ "$XFS_REPAIR_PROG" = "" ] && _fatal "xfs_repair not found"
	 [ "$XFS_CHECK_PROG" = "" ] && _fatal "xfs_check not found"
	 [ "$XFS_DB_PROG" = "" ] && _fatal "xfs_db not found"
	 [ "$MKFS_XFS_PROG" = "" ] && _fatal "mkfs_xfs not found" 
	 ;;
    udf)
	 [ "$MKFS_UDF_PROG" = "" ] && _fatal "mkfs_udf/mkudffs not found"
	 ;;
    btrfs)
	 [ "$MKFS_BTRFS_PROG" = "" ] && _fatal "mkfs.btrfs not found"
	 ;;
    nfs)
	 ;;
esac
