#! /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/test_names

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

export AWK_PROG="$(type -P awk)"
[ "$AWK_PROG" = "" ] && { echo "awk not found"; exit; }

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 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] (separate by space, ? 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
	    # only allow lower cases, spaces, digits and underscore in group
	    inval=`echo $ans | tr -d '[:lower:][:space:][:digit:]_'`
	    if [ "$inval" != "" ]; then
		echo "Invalid characters in group(s): $inval"
		echo "Only lower cases, digits and underscore are allowed in groups, separated by space"
		continue
	    else
		# remove redundant spaces/tabs
		ans=`echo "$ans" | sed 's/\s\+/ /g'`
		break
	    fi
	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
