#! /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
#
#-----------------------------------------------------------------------
#
# Make a new test
#

# generic initialization
iam=new
. ./common/rc

trap "rm -f /tmp/$$.; exit" 0 1 2 3 15

_cleanup()
{
    :
}

SRC_GROUPS=`find tests -not -path tests -type d -printf "%f "`
usage()
{
    echo "Usage $0 test_dir"
    echo "Available dirs are: $SRC_GROUPS"
    exit
}

[ $# -eq 0 ] && usage
tdir=tests/$1
shift

if [ ! -f $tdir/group ]
then
    echo "Creating the $tdir/group index ..."
    cat <<'End-of-File' >$tdir/group
# QA groups control
#
# define groups and default group owners
# do not start group name with a digit
#

# catch-all
#
other		some-user-login

# test-group association ... one line per test
#
End-of-File
fi

if [ ! -w $tdir/group ]
then
    chmod u+w $tdir/group
    echo "Warning: making the index file \"$tdir/group\" writeable"
fi

if make
then
    :
else
    echo "Warning: make failed -- some tests may be missing"
fi

i=0
line=0
eof=1
[ -f "$tdir/group" ] || usage

for found in `cat $tdir/group | tr - ' ' | $AWK_PROG '{ print $1 }'`
do
    line=$((line+1))
    if [ -z "$found" ] || [ "$found" == "#" ]; then
        continue
    elif ! echo "$found" | grep -q "^$VALID_TEST_NAME$"; then
        # this one is for tests not named by a number
        continue
    fi
    i=$((i+1))
    id=`printf "%03d" $i`
    if [ "$id" != "$found" ];then
	eof=0
	break
    fi
done
if [ $eof -eq 1 ]; then
   line=$((line+1))
   i=$((i+1))
   id=`printf "%03d" $i`
fi

echo "Next test id is $id"

read -p "Append a name to the ID? Test name will be $id-\$name. y,[n]: " -r
if [[ $REPLY = [Yy] ]]; then
	# get the new name from user
	name=""
	while [ "$name" = "" ]; do
		read -p "Enter the name: "
		if [ "$REPLY" = "" ]; then
			echo "For canceling, use ctrl+c."
		elif echo "$id-$REPLY" | grep -q "^$VALID_TEST_NAME$"; then
			if [ -e "$tdir/$id-$REPLY" ]; then
				echo "File '$id-$REPLY' already exists, use another one."
				echo
			else
				name="$REPLY"
			fi
		else
			echo "A name can contain only alphanumeric symbols and dash!"
			echo
		fi
	done

	# now find where to insert this name
	eof=1
	for found in `tail -n +$line $tdir/group | $AWK_PROG '{ print $1 }'`; do
		found_id=$(echo "$found" | cut -d "-" -f 1 - )
		line=$((line+1))
		if [ -z "$found" ] || [ "$found" == "#" ]; then
			continue
		elif [ $found_id -gt $id ]; then
			eof=0
			break
		fi
	done
	if [ $eof -eq 0 ]; then
		# If place wasn't found, let $line be the end of the file
		line=$((line-1))
	fi
	id="$id-$name"
fi
echo "Creating test file '$id'"

if [ -f $tdir/$id ]
then
    echo "Error: test $id already exists!"
    _cleanup
    exit 1
fi

echo -n "Creating skeletal script for you to edit ..."

year=`date +%Y`

cat <<End-of-File >$tdir/$id
#! /bin/bash
# FS QA Test $id
#
# what am I here for?
#
#-----------------------------------------------------------------------
# Copyright (c) $year YOUR NAME HERE.  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
#-----------------------------------------------------------------------
#

seq=\`basename \$0\`
seqres=\$RESULT_DIR/\$seq
echo "QA output created by \$seq"

here=\`pwd\`
tmp=/tmp/\$\$
status=1	# failure is the default!
trap "_cleanup; exit \\\$status" 0 1 2 3 15

_cleanup()
{
	cd /
	rm -f \$tmp.*
}

# get standard environment, filters and checks
. ./common/rc
. ./common/filter

# remove previous \$seqres.full before test
rm -f \$seqres.full

# real QA test starts here

# Modify as appropriate.
_supported_fs generic
_supported_os IRIX Linux
_require_test

# if error
exit

# optional stuff if your test has verbose output to help resolve problems
#echo
#echo "If failure, check \$seqres.full (this) and \$seqres.full.ok (reference)"

# success, all done
status=0
exit
End-of-File

sleep 2		# latency to read messages to this point
echo ""

chmod 755 $tdir/$id
${EDITOR-vi} $tdir/$id

# Create default .out file
cat <<End-of-File >$tdir/$id.out
QA output created by $id
Silence is golden
End-of-File

if [ $# -eq 0 ]
then

    while true
    do
	echo -n "Add to group(s) [other] (? for list): "
	read ans
	[ -z "$ans" ] && ans=other
	if [ "X$ans" = "X?" ]
	then
	    for d in $SRC_GROUPS; do
		l=$(sed -n < tests/$d/group \
		    -e 's/#.*//' \
		    -e 's/$/ /' \
		    -e 's;\(^[0-9][0-9][0-9]\)\(.*$\);\2;p')
		grpl="$grpl $l"
	    done
	    lst=`for word in $grpl; do echo $word; done | sort| uniq `
	    echo $lst
	else
	    break
	fi
    done
else
    # expert mode, groups are on the command line
    #
    for g in $*
    do
	if grep "^$g[ 	]" $tdir/group >/dev/null
	then
	    :
	else
	    echo "Warning: group \"$g\" not defined in $tdir/group"
	fi
    done
    ans="$*"
fi

echo -n "Adding $id to group index ..."
head -n $(($line-1)) $tdir/group > /tmp/$$.group
echo "$id $ans" >> /tmp/$$.group
tail -n +$((line)) $tdir/group >> /tmp/$$.group
mv /tmp/$$.group $tdir/group
echo " done."

exit 0
