generic: test MADV_POPULATE_READ with IO errors
[xfstests-dev.git] / new
diff --git a/new b/new
index 6b7dc5d4840341a6017c554b52da38457dcbb8fb..9651e0e0b748eb8a6ed76c3d7d2e0fc1634edc35 100755 (executable)
--- a/new
+++ b/new
@@ -91,41 +91,49 @@ group_names() {
        }' doc/group-names.txt
 }
 
-if [ $# -eq 0 ]
-then
+# Make sure that the new test's groups fit the correct format and are listed
+# in the group documentation file.
+check_groups() {
+       for g in "$@"; do
+               local inval="$(echo "${g}" | tr -d '[:lower:][:space:][:digit:]_')"
+               if [ -n "${inval}" ]; then
+                       echo "Invalid characters in group(s): ${inval}"
+                       echo "Only lower cases, digits and underscore are allowed in groups, separated by space"
+                       return 1
+               elif [ "${g}" = "other" ]; then
+                       echo "Do not add more tests to group \"other\""
+                       return 1
+               elif ! group_names | grep -q -w "${g}"; then
+                       echo "Warning: group \"${g}\" not defined in documentation"
+                       return 1
+               fi
+       done
 
-    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
-           echo $(group_names)
-       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
+       return 0
+}
+
+if [ $# -eq 0 ]; then
+       # interactive mode
+       prompt="Add to group(s) [auto] (separate by space, ? for list): "
+       while true; do
+               read -p "${prompt}" -a new_groups || exit 1
+               case "${#new_groups[@]}" in
+               0)
+                       new_groups=("auto")
+                       ;;
+               1)
+                       if [ "${new_groups[0]}" = "?" ]; then
+                               echo $(group_names | grep -v -w 'other')
+                               continue
+                       fi
+                       ;;
+               esac
+               check_groups "${new_groups[@]}" && break
+       done
 else
-    # expert mode, groups are on the command line
-    #
-    for g in $*
-    do
-       if ! grep -q "^$g" doc/group-names.txt; then
-           echo "Warning: group \"$g\" not defined in documentation"
-       fi
-    done
-    ans="$*"
+       # expert mode, groups are on the command line
+       new_groups=("$@")
+       check_groups "${new_groups[@]}" || exit 1
 fi
 
 echo -n "Creating skeletal script for you to edit ..."
@@ -142,7 +150,7 @@ cat <<End-of-File >$tdir/$id
 # what am I here for?
 #
 . ./common/preamble
-_begin_fstest $ans
+_begin_fstest ${new_groups[@]}
 
 # Override the default cleanup function.
 # _cleanup()