#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2000-2005 Silicon Graphics, Inc.  All Rights Reserved.
#
# 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
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) $year YOUR NAME HERE.  All Rights Reserved.
#
# FS QA Test $id
#
# what am I here for?
#
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
