* [RFC PATCH 1/4] check: refactor argument parsing with getopt
2026-05-12 13:25 [RFC PATCH 0/4] Rewrite the check argument parsing Zorro Lang
@ 2026-05-12 13:25 ` Zorro Lang
2026-05-12 13:25 ` [RFC PATCH 2/4] check: update usage and README to reflect new argument parsing Zorro Lang
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Zorro Lang @ 2026-05-12 13:25 UTC (permalink / raw)
To: fstests; +Cc: Theodore Ts'o
Replace the legacy, hand-written argument parsing loop with getopt.
Also compatible with old-style options (e.g. -nfs, -afs, -glusterfs,
-cifs, -9p, -fuse, -virtiofs, -pvfs2, -tmpfs, -ubifs, -overlay,
-udiff), pre-process them into long options before giving to getopt.
Signed-off-by: Zorro Lang <zlang@kernel.org>
---
check | 179 +++++++++++++++++++++++++++++++++++++++++-----------------
1 file changed, 126 insertions(+), 53 deletions(-)
diff --git a/check b/check
index ad685edc..11bdf81b 100755
--- a/check
+++ b/check
@@ -272,48 +272,97 @@ _prepare_test_list()
rm -f $tmp.list
}
-# Process command arguments first.
+# Backward compatible with the old options mode. Translate word-style options
+# that getopt would misinterpret into long options.
+compat_old_option()
+{
+ check_args=()
+ while [ $# -gt 0 ]; do
+ case "$1" in
+ -nfs) check_args+=("--fs" "nfs") ;;
+ -afs) check_args+=("--fs" "afs") ;;
+ -glusterfs) check_args+=("--fs" "glusterfs") ;;
+ -cifs) check_args+=("--fs" "cifs") ;;
+ -9p) check_args+=("--fs" "9p") ;;
+ -fuse) check_args+=("--fs" "fuse") ;;
+ -virtiofs) check_args+=("--fs" "virtiofs") ;;
+ -pvfs2) check_args+=("--fs" "pvfs2") ;;
+ -tmpfs) check_args+=("--fs" "tmpfs") ;;
+ -ubifs) check_args+=("--fs" "ubifs") ;;
+ -overlay) check_args+=("--fs" "overlay") ;;
+ -udiff) check_args+=("--udiff") ;;
+ *) check_args+=("$1") ;;
+ esac
+ shift
+ done
+}
+
+short_opts="g:x:X:e:E:s:S:lnri:I:TdbR:L:h"
+long_opts="fs:,exact-order,large-fs,extra-space:,udiff,help"
+
+compat_old_option "$@"
+
+# Note: The '+' prefix in getopt's option string preserves the existing
+# behavior that option parsing stops at the first non-option test argument.
+parsed_opts=$(getopt -n "check" -o +"${short_opts}" -l "$long_opts" -- "${check_args[@]}")
+test $? -ne 0 && usage
+
+eval set -- "$parsed_opts"
+
while [ $# -gt 0 ]; do
case "$1" in
- -\? | -h | --help) usage ;;
-
- -nfs|-afs|-glusterfs|-cifs|-9p|-fuse|-virtiofs|-pvfs2|-tmpfs|-ubifs)
- FSTYP="${1:1}"
+ --fs)
+ if [ "$2" == "overlay" ];then
+ [ "$FSTYP" == overlay ] || \
+ export OVL_BASE_FSTYP="$FSTYP"
+ FSTYP=overlay
+ export OVERLAY=true
+ else
+ FSTYP="$2"
+ fi
+ shift
;;
- -overlay)
- [ "$FSTYP" == overlay ] || export OVL_BASE_FSTYP="$FSTYP"
- FSTYP=overlay
- export OVERLAY=true
+ --udiff)
+ diff="$diff -u"
;;
-
- -g) group=$2 ; shift ;
- GROUP_LIST="$GROUP_LIST ${group//,/ }"
+ -g)
+ GROUP_LIST="$GROUP_LIST ${2//,/ }"
+ shift
;;
-
- -x) xgroup=$2 ; shift ;
- XGROUP_LIST="$XGROUP_LIST ${xgroup//,/ }"
+ -x)
+ XGROUP_LIST="$XGROUP_LIST ${2//,/ }"
+ shift
;;
-
- -X) subdir_xfile=$2; shift ;
+ -X)
+ subdir_xfile="$2"
+ shift
;;
-e)
- xfile=$2; shift ;
readarray -t -O "${#exclude_tests[@]}" exclude_tests < \
- <(echo "$xfile" | tr ', ' '\n\n')
+ <(echo "$2" | tr ', ' '\n\n')
+ shift
;;
-
- -E) xfile=$2; shift ;
- if [ -f $xfile ]; then
+ -E)
+ if [ -f "$2" ]; then
readarray -t -O ${#exclude_tests[@]} exclude_tests < \
- <(sed "s/#.*$//" $xfile)
+ <(sed "s/#.*$//" "$2")
fi
+ shift
+ ;;
+ -s)
+ RUN_SECTION="$RUN_SECTION $2"
+ shift
+ ;;
+ -S)
+ EXCLUDE_SECTION="$EXCLUDE_SECTION $2"
+ shift
+ ;;
+ -l)
+ diff="diff"
+ ;;
+ -n)
+ showme=true
;;
- -s) RUN_SECTION="$RUN_SECTION $2"; shift ;;
- -S) EXCLUDE_SECTION="$EXCLUDE_SECTION $2"; shift ;;
- -l) diff="diff" ;;
- -udiff) diff="$diff -u" ;;
-
- -n) showme=true ;;
-r)
if $exact_order; then
_fatal "Cannot specify -r and --exact-order."
@@ -322,40 +371,64 @@ while [ $# -gt 0 ]; do
;;
--exact-order)
if $randomize; then
- _fatal "Cannnot specify --exact-order and -r."
+ _fatal "Cannot specify --exact-order and -r."
fi
exact_order=true
;;
- -i) iterations=$2; shift ;;
- -I) iterations=$2; istop=true; shift ;;
- -T) timestamp=true ;;
- -d) DUMP_OUTPUT=true ;;
- -b) brief_test_summary=true;;
- -R) report_fmt=$2 ; shift ;
- REPORT_LIST="$REPORT_LIST ${report_fmt//,/ }"
+ -i)
+ iterations=$2
+ shift
+ ;;
+ -I)
+ iterations=$2
+ istop=true
+ shift
+ ;;
+ -T)
+ timestamp=true
+ ;;
+ -d)
+ DUMP_OUTPUT=true
+ ;;
+ -b)
+ brief_test_summary=true
+ ;;
+ -R)
+ REPORT_LIST="$REPORT_LIST ${2//,/ }"
do_report=true
+ shift
;;
- --large-fs) export LARGE_SCRATCH_DEV=yes ;;
- --extra-space=*) export SCRATCH_DEV_EMPTY_SPACE=${r#*=} ;;
- -L) [[ $2 =~ ^[0-9]+$ ]] || usage
- loop_on_fail=$2; shift
+ --large-fs)
+ export LARGE_SCRATCH_DEV=yes
+ ;;
+ --extra-space)
+ export SCRATCH_DEV_EMPTY_SPACE="$2"
+ shift
+ ;;
+ -L)
+ [[ $2 =~ ^[0-9]+$ ]] || usage
+ loop_on_fail=$2
+ shift
+ ;;
+ -h|--help)
+ usage
+ ;;
+ --)
+ shift
+ break
+ ;;
+ *)
+ usage
;;
-
- -*) usage ;;
- *) # not an argument, we've got tests now.
- have_test_arg=true ;;
esac
-
- # if we've found a test specification, the break out of the processing
- # loop before we shift the arguments so that this is the first argument
- # that we process in the test arg loop below.
- if $have_test_arg; then
- break;
- fi
-
shift
done
+# Remaining arguments
+if [ $# -gt 0 ]; then
+ have_test_arg=true
+fi
+
# we need common/rc, that also sources common/config. We need to source it
# after processing args, overlay needs FSTYP set before sourcing common/config
if ! . ./common/rc; then
--
2.54.0
^ permalink raw reply related [flat|nested] 5+ messages in thread* [RFC PATCH 2/4] check: update usage and README to reflect new argument parsing
2026-05-12 13:25 [RFC PATCH 0/4] Rewrite the check argument parsing Zorro Lang
2026-05-12 13:25 ` [RFC PATCH 1/4] check: refactor argument parsing with getopt Zorro Lang
@ 2026-05-12 13:25 ` Zorro Lang
2026-05-12 13:25 ` [RFC PATCH 3/4] check: consolidate argument handling into function Zorro Lang
2026-05-12 13:25 ` [RFC PATCH 4/4] check: add deprecated options warning Zorro Lang
3 siblings, 0 replies; 5+ messages in thread
From: Zorro Lang @ 2026-05-12 13:25 UTC (permalink / raw)
To: fstests; +Cc: Theodore Ts'o
Update usage() function, README.* files and some comments to match
the new argument parsing method.
Signed-off-by: Zorro Lang <zlang@kernel.org>
---
README | 10 +++---
README.overlay | 18 +++++------
check | 85 ++++++++++++++++++++++++++------------------------
common/config | 8 ++---
common/rc | 2 +-
5 files changed, 63 insertions(+), 60 deletions(-)
diff --git a/README b/README
index e0cee43a..8644f163 100644
--- a/README
+++ b/README
@@ -386,7 +386,7 @@ Misc:
- Set DIFF_LENGTH to "number of diff lines to print from a failed test",
by default 10, set to 0 to print the full diff
- set IDMAPPED_MOUNTS=true to run all tests on top of idmapped mounts. While
- this option is supported for all filesystems currently only -overlay is
+ this option is supported for all filesystems currently only `--fs overlay` is
expected to run without issues. For other filesystems additional patches
and fixes to the test suite might be needed.
- Set REPORT_VARS_FILE to a file containing colon-separated name-value pairs
@@ -417,10 +417,10 @@ Running tests:
- To randomize test order: ./check -r [test(s)]
- You can explicitly specify NFS/AFS/CIFS/OVERLAY, otherwise
the filesystem type will be autodetected from $TEST_DEV:
- - for running nfs tests: ./check -nfs [test(s)]
- - for running afs tests: ./check -afs [test(s)]
- - for running cifs/smb3 tests: ./check -cifs [test(s)]
- - for overlay tests: ./check -overlay [test(s)]
+ - for running nfs tests: ./check --fs nfs [test(s)]
+ - for running afs tests: ./check --fs afs [test(s)]
+ - for running cifs/smb3 tests: ./check --fs cifs [test(s)]
+ - for overlay tests: ./check --fs overlay [test(s)]
The TEST and SCRATCH partitions should be pre-formatted
with another base fs, where the overlay dirs will be created
diff --git a/README.overlay b/README.overlay
index 3093bf8c..52bcd332 100644
--- a/README.overlay
+++ b/README.overlay
@@ -1,5 +1,5 @@
To run xfstest on overlayfs, configure the variables of TEST and SCRATCH
-partitions to be used as the "base fs" and run './check -overlay'.
+partitions to be used as the "base fs" and run './check --fs overlay'.
For example, the following config file can be used to run tests on
xfs test/scratch partitions:
@@ -10,24 +10,24 @@ xfs test/scratch partitions:
SCRATCH_MNT=/mnt/scratch
FSTYP=xfs
-Using the same config file, but executing './check -overlay' will
+Using the same config file, but executing './check --fs overlay' will
use the same partitions as base fs for overlayfs directories
and set TEST_DIR/SCRATCH_MNT values to overlay mount points, i.e.:
/mnt/test/ovl-mnt and /mnt/scratch/ovl-mnt, for the context of
individual tests.
-'./check -overlay' does not support mkfs and fsck on the base fs, so
-the base fs should be pre-formatted before starting the -overlay run.
+'./check --fs overlay' does not support mkfs and fsck on the base fs, so
+the base fs should be pre-formatted before starting the --fs overlay run.
An easy way to accomplish this is by running './check <some test>' once,
-before running './check -overlay'.
+before running './check --fs overlay'.
-'./check -overlay' support check overlay test and scratch dirs,
+'./check --fs overlay' support check overlay test and scratch dirs,
OVERLAY_FSCK_OPTIONS should be set instead of FSCK_OPTIONS if fsck
options need to given directly.
Because of the lack of mkfs support, multi-section config files are only
-partly supported with './check -overlay'. Only multi-section files that
-do not change FSTYP and MKFS_OPTIONS can be safely used with -overlay.
+partly supported with './check --fs overlay'. Only multi-section files that
+do not change FSTYP and MKFS_OPTIONS can be safely used with --fs overlay.
For example, the following multi-section config file can be used to
run overlay tests on the same base fs, but with different mount options, and on
@@ -66,7 +66,7 @@ To enable running unionmount testsuite, clone the git repository from:
under the xfstests src directory, or set the environment variable
UNIONMOUNT_TESTSUITE to the local path where the repository was cloned.
-Run './check -overlay -g overlay/union' to execute all the unionmount testsuite
+Run './check --fs overlay -g overlay/union' to execute all the unionmount testsuite
test cases.
diff --git a/check b/check
index 11bdf81b..5fe35e8e 100755
--- a/check
+++ b/check
@@ -56,43 +56,47 @@ export SRC_DIR="tests"
usage()
{
- echo "Usage: $0 [options] [testlist]"'
-
-check options
- -nfs test NFS
- -afs test AFS
- -glusterfs test GlusterFS
- -cifs test CIFS
- -9p test 9p
- -fuse test fuse
- -virtiofs test virtiofs
- -overlay test overlay
- -pvfs2 test PVFS2
- -tmpfs test TMPFS
- -ubifs test ubifs
- -l line mode diff
- -udiff show unified diff (default)
- -n show me, do not run tests
- -T output timestamps
- -r randomize test order
- --exact-order run tests in the exact order specified
- -i <n> iterate the test list <n> times
- -I <n> iterate the test list <n> times, but stops iterating further in case of any test failure
- -d dump test output to stdout
- -b brief test summary
- -R fmt[,fmt] generate report in formats specified. Supported formats: xunit, xunit-quiet
- --large-fs optimise scratch device for large filesystems
- -s section run only specified section from config file
- -S section exclude the specified section from the config file
- -L <n> loop tests <n> times following a failure, measuring aggregate pass/fail metrics
-
-testlist options
- -g group[,group...] include tests from these groups
- -x group[,group...] exclude tests from these groups
- -X exclude_file exclude individual tests
- -e testlist exclude a specific list of tests
- -E external_file exclude individual tests
- [testlist] include tests matching names in testlist
+ echo "Usage: $0 [options] [testlist]"'
+
+General options:
+ -b brief test summary
+ -d dump test output to stdout
+ -h, --help show this help message
+ -i <n> iterate the test list <n> times
+ -I <n> iterate the test list <n> times, but stops
+ iterating further in case of any test failure
+ -l line mode diff
+ -L <n> loop tests <n> times following a failure, measuring
+ aggregate pass/fail metrics
+ -n show me, do not run tests
+ -r randomize test order
+ -s section run only specified section from config file
+ -S section exclude the specified section from the config file
+ -T output timestamps
+ -R fmt[,fmt] generate report in formats specified. Supported
+ formats: xunit, xunit-quiet
+ --exact-order run tests in the exact order specified
+ --extra-space <size> require minimum free space on scratch device
+ --fs <type> test the given FSTYP; valid types include:
+ nfs, afs, glusterfs, cifs, 9p, fuse, virtiofs,
+ overlay, pvfs2, tmpfs, ubifs
+ --large-fs optimise scratch device for large filesystems
+ --udiff show unified diff (default)
+
+Test selection options:
+ -e testlist exclude a specific list of tests
+ -E external_file exclude tests listed in the given file
+ -g group[,group...] include tests from these groups
+ -x group[,group...] exclude tests from these groups
+ -X exclude_file exclude individual tests
+ [testlist] include tests matching names in testlist
+
+Backward-compatible options:
+ For compatibility, old options are still accepted (but deprecated):
+ --fs <nfs|afs|glusterfs|...> is equivalent to:
+ -nfs, -afs, -glusterfs, -cifs, -9p, -fuse, -virtiofs, -overlay,
+ -pvfs2, -tmpfs, -ubifs
+ -udiff is equivalent to --udiff.
testlist argument is a list of tests in the form of <test dir>/<test name>.
@@ -109,7 +113,7 @@ If you want to run all the tests in the test suite, use "-g all" to specify all
groups.
exclude_file argument refers to a name of a file inside each test directory.
-for every test dir where this file is found, the listed test names are
+For every test dir where this file is found, the listed test names are
excluded from the list of tests to run from that test dir.
external_file argument is a path to a single file containing a list of tests
@@ -117,15 +121,14 @@ to exclude in the form of <test dir>/<test name>.
examples:
check xfs/001
- check -g quick
+ check --fs overlay -g quick
check -g xfs/quick
check -x stress xfs/*
check -X .exclude -g auto
check -E ~/.xfstests.exclude
'
- _fatal
+ _fatal
}
-
get_sub_group_list()
{
local d=$1
diff --git a/common/config b/common/config
index d5299d5b..69e5d833 100644
--- a/common/config
+++ b/common/config
@@ -692,7 +692,7 @@ _canonicalize_devices()
fi
}
-# On check -overlay, for the non multi section config case, this
+# On check --fs overlay, for the non multi section config case, this
# function is called on every test, before init_rc().
# When SCRATCH/TEST_* vars are defined in config file, config file
# is sourced on every test and this function overrides the vars
@@ -714,7 +714,7 @@ _overlay_config_override()
[ ! -d "$TEST_DEV" ] || export OVL_BASE_TEST_DIR="$TEST_DEV"
[ ! -d "$SCRATCH_DEV" ] || export OVL_BASE_SCRATCH_MNT="$SCRATCH_DEV"
- # Config file may specify base fs type, but we obay -overlay flag
+ # Config file may specify base fs type, but we obay --fs overlay flag
[ "$FSTYP" == overlay ] || export OVL_BASE_FSTYP="$FSTYP"
export FSTYP=overlay
@@ -895,7 +895,7 @@ get_next_config() {
_check_device SCRATCH_LOGDEV optional $SCRATCH_LOGDEV
fi
- # Override FSTYP from config when running ./check -overlay
+ # Override FSTYP from config when running ./check --fs overlay
# and maybe override base fs TEST/SCRATCH_DEV with overlay base dirs.
# We need to do this *after* default mount options are set by base FSTYP
# and *after* SCRATCH_DEV is deduced from SCRATCH_DEV_POOL
@@ -930,7 +930,7 @@ else
export TEST_DIR=`_canonicalize_mountpoint TEST_DIR $TEST_DIR`
export SCRATCH_MNT=`_canonicalize_mountpoint SCRATCH_MNT $SCRATCH_MNT`
- # Override FSTYP from config when running ./check -overlay
+ # Override FSTYP from config when running ./check --fs overlay
# and maybe override base fs TEST/SCRATCH_DEV with overlay base dirs
if [ "$OVERLAY" == "true" -o "$FSTYP" == "overlay" ]; then
_overlay_config_override
diff --git a/common/rc b/common/rc
index 26db5bbd..39d24ef0 100644
--- a/common/rc
+++ b/common/rc
@@ -4340,7 +4340,7 @@ _has_metadata_journaling()
;;
overlay)
# metadata journaling check is based on base filesystem configurations
- # and because -overlay option saves those configurations to OVL_BASE_*,
+ # and because --fs overlay option saves those configurations to OVL_BASE_*,
# adding restore/override the configurations before/after the check.
if [ ! -z $OVL_BASE_FSTYP -a $OVL_BASE_FSTYP != "overlay" ]; then
local ret
--
2.54.0
^ permalink raw reply related [flat|nested] 5+ messages in thread* [RFC PATCH 3/4] check: consolidate argument handling into function
2026-05-12 13:25 [RFC PATCH 0/4] Rewrite the check argument parsing Zorro Lang
2026-05-12 13:25 ` [RFC PATCH 1/4] check: refactor argument parsing with getopt Zorro Lang
2026-05-12 13:25 ` [RFC PATCH 2/4] check: update usage and README to reflect new argument parsing Zorro Lang
@ 2026-05-12 13:25 ` Zorro Lang
2026-05-12 13:25 ` [RFC PATCH 4/4] check: add deprecated options warning Zorro Lang
3 siblings, 0 replies; 5+ messages in thread
From: Zorro Lang @ 2026-05-12 13:25 UTC (permalink / raw)
To: fstests; +Cc: Theodore Ts'o
Consolidate the check script's options and any trailing arguments
(e.g. test case list) into the parse_check_args() function (and
sub-function of it), to clean up the scattered logic.
Signed-off-by: Zorro Lang <zlang@kernel.org>
---
check | 333 ++++++++++++++++++++++++++++++----------------------------
1 file changed, 172 insertions(+), 161 deletions(-)
diff --git a/check b/check
index 5fe35e8e..d19498e6 100755
--- a/check
+++ b/check
@@ -15,7 +15,7 @@ notrun=()
interrupt=true
diff="diff -u"
showme=false
-have_test_arg=false
+remain_args=()
randomize=false
exact_order=false
export here=`pwd`
@@ -228,7 +228,7 @@ _prepare_test_list()
# Specified groups to include
# Note that the CLI processing adds a leading space to the first group
# parameter, so we have to catch that here checking for "all"
- if ! $have_test_arg && [ "$GROUP_LIST" == " all" ]; then
+ if [ ${#remain_args[@]} -eq 0 ] && [ "$GROUP_LIST" == " all" ]; then
# no test numbers, do everything
get_all_tests
else
@@ -300,137 +300,182 @@ compat_old_option()
done
}
-short_opts="g:x:X:e:E:s:S:lnri:I:TdbR:L:h"
-long_opts="fs:,exact-order,large-fs,extra-space:,udiff,help"
-
-compat_old_option "$@"
+# Process tests from command line now.
+process_remain_tests()
+{
+ local list test_dir test_name group_file
-# Note: The '+' prefix in getopt's option string preserves the existing
-# behavior that option parsing stops at the first non-option test argument.
-parsed_opts=$(getopt -n "check" -o +"${short_opts}" -l "$long_opts" -- "${check_args[@]}")
-test $? -ne 0 && usage
+ while [ $# -gt 0 ]; do
+ case "$1" in
+ -*)
+ _fatal "Arguments before tests, please!"
+ ;;
+ *)
+ # Expand test pattern (e.g. xfs/???, *fs/001)
+ list=$(cd $SRC_DIR; echo $1)
+ for t in $list; do
+ t=${t#$SRC_DIR/}
+ test_dir=${t%%/*}
+ test_name=${t##*/}
+ group_file=$SRC_DIR/$test_dir/group.list
-eval set -- "$parsed_opts"
+ if grep -Eq "^$test_name" $group_file; then
+ # in group file ... OK
+ echo $SRC_DIR/$test_dir/$test_name \
+ >>$tmp.arglist
+ else
+ # oops
+ echo "$t - unknown test, ignored"
+ fi
+ done
+ ;;
+ esac
-while [ $# -gt 0 ]; do
- case "$1" in
- --fs)
- if [ "$2" == "overlay" ];then
- [ "$FSTYP" == overlay ] || \
- export OVL_BASE_FSTYP="$FSTYP"
- FSTYP=overlay
- export OVERLAY=true
- else
- FSTYP="$2"
- fi
- shift
- ;;
- --udiff)
- diff="$diff -u"
- ;;
- -g)
- GROUP_LIST="$GROUP_LIST ${2//,/ }"
- shift
- ;;
- -x)
- XGROUP_LIST="$XGROUP_LIST ${2//,/ }"
- shift
- ;;
- -X)
- subdir_xfile="$2"
shift
- ;;
- -e)
- readarray -t -O "${#exclude_tests[@]}" exclude_tests < \
- <(echo "$2" | tr ', ' '\n\n')
- shift
- ;;
- -E)
- if [ -f "$2" ]; then
- readarray -t -O ${#exclude_tests[@]} exclude_tests < \
- <(sed "s/#.*$//" "$2")
- fi
- shift
- ;;
- -s)
- RUN_SECTION="$RUN_SECTION $2"
- shift
- ;;
- -S)
- EXCLUDE_SECTION="$EXCLUDE_SECTION $2"
- shift
- ;;
- -l)
- diff="diff"
- ;;
- -n)
- showme=true
- ;;
- -r)
- if $exact_order; then
- _fatal "Cannot specify -r and --exact-order."
- fi
- randomize=true
- ;;
- --exact-order)
- if $randomize; then
- _fatal "Cannot specify --exact-order and -r."
- fi
- exact_order=true
- ;;
- -i)
- iterations=$2
- shift
- ;;
- -I)
- iterations=$2
- istop=true
- shift
- ;;
- -T)
- timestamp=true
- ;;
- -d)
- DUMP_OUTPUT=true
- ;;
- -b)
- brief_test_summary=true
- ;;
- -R)
- REPORT_LIST="$REPORT_LIST ${2//,/ }"
- do_report=true
- shift
- ;;
- --large-fs)
- export LARGE_SCRATCH_DEV=yes
- ;;
- --extra-space)
- export SCRATCH_DEV_EMPTY_SPACE="$2"
- shift
- ;;
- -L)
- [[ $2 =~ ^[0-9]+$ ]] || usage
- loop_on_fail=$2
- shift
- ;;
- -h|--help)
- usage
- ;;
- --)
+ done
+}
+
+parse_check_args()
+{
+ local short_opts="g:x:X:e:E:s:S:lnri:I:TdbR:L:h"
+ local long_opts="fs:,exact-order,large-fs,extra-space:,udiff,help"
+
+ compat_old_option "$@"
+
+ # Note: The '+' prefix in getopt's option string preserves the existing
+ # behavior that option parsing stops at the first non-option test argument.
+ local parsed_opts=$(getopt -n "check" -o +"${short_opts}" -l "$long_opts" -- "${check_args[@]}")
+ test $? -ne 0 && usage
+
+ eval set -- "$parsed_opts"
+
+ while [ $# -gt 0 ]; do
+ case "$1" in
+ --fs)
+ if [ "$2" == "overlay" ];then
+ [ "$FSTYP" == overlay ] || \
+ export OVL_BASE_FSTYP="$FSTYP"
+ FSTYP=overlay
+ export OVERLAY=true
+ else
+ FSTYP="$2"
+ fi
+ shift
+ ;;
+ --udiff)
+ diff="$diff -u"
+ ;;
+ -g)
+ GROUP_LIST="$GROUP_LIST ${2//,/ }"
+ shift
+ ;;
+ -x)
+ XGROUP_LIST="$XGROUP_LIST ${2//,/ }"
+ shift
+ ;;
+ -X)
+ subdir_xfile="$2"
+ shift
+ ;;
+ -e)
+ readarray -t -O "${#exclude_tests[@]}" exclude_tests < \
+ <(echo "$2" | tr ', ' '\n\n')
+ shift
+ ;;
+ -E)
+ if [ -f "$2" ]; then
+ readarray -t -O ${#exclude_tests[@]} exclude_tests < \
+ <(sed "s/#.*$//" "$2")
+ fi
+ shift
+ ;;
+ -s)
+ RUN_SECTION="$RUN_SECTION $2"
+ shift
+ ;;
+ -S)
+ EXCLUDE_SECTION="$EXCLUDE_SECTION $2"
+ shift
+ ;;
+ -l)
+ diff="diff"
+ ;;
+ -n)
+ showme=true
+ ;;
+ -r)
+ if $exact_order; then
+ _fatal "Cannot specify -r and --exact-order."
+ fi
+ randomize=true
+ ;;
+ --exact-order)
+ if $randomize; then
+ _fatal "Cannot specify --exact-order and -r."
+ fi
+ exact_order=true
+ ;;
+ -i)
+ iterations=$2
+ shift
+ ;;
+ -I)
+ iterations=$2
+ istop=true
+ shift
+ ;;
+ -T)
+ timestamp=true
+ ;;
+ -d)
+ DUMP_OUTPUT=true
+ ;;
+ -b)
+ brief_test_summary=true
+ ;;
+ -R)
+ REPORT_LIST="$REPORT_LIST ${2//,/ }"
+ do_report=true
+ shift
+ ;;
+ --large-fs)
+ export LARGE_SCRATCH_DEV=yes
+ ;;
+ --extra-space)
+ export SCRATCH_DEV_EMPTY_SPACE="$2"
+ shift
+ ;;
+ -L)
+ [[ $2 =~ ^[0-9]+$ ]] || usage
+ loop_on_fail=$2
+ shift
+ ;;
+ -h|--help)
+ usage
+ ;;
+ --)
+ shift
+ break
+ ;;
+ *)
+ usage
+ ;;
+ esac
shift
- break
- ;;
- *)
- usage
- ;;
- esac
- shift
-done
+ done
-# Remaining arguments
-if [ $# -gt 0 ]; then
- have_test_arg=true
-fi
+ # Remaining arguments (tests list)
+ if [ $# -gt 0 ]; then
+ remain_args=("$@")
+ process_remain_tests "${remain_args[@]}"
+ elif [ -z "$GROUP_LIST" ]; then
+ # default group list is the auto group. If any other group or
+ # test is specified, we use that instead.
+ GROUP_LIST="auto"
+ fi
+}
+
+parse_check_args "$@"
# we need common/rc, that also sources common/config. We need to source it
# after processing args, overlay needs FSTYP set before sourcing common/config
@@ -471,40 +516,6 @@ if [ -n "$subdir_xfile" ]; then
done
fi
-# Process tests from command line now.
-if $have_test_arg; then
- while [ $# -gt 0 ]; do
- case "$1" in
- -*) _fatal "Arguments before tests, please!"
- ;;
- *) # Expand test pattern (e.g. xfs/???, *fs/001)
- list=$(cd $SRC_DIR; echo $1)
- for t in $list; do
- t=${t#$SRC_DIR/}
- test_dir=${t%%/*}
- test_name=${t##*/}
- group_file=$SRC_DIR/$test_dir/group.list
-
- if grep -Eq "^$test_name" $group_file; then
- # in group file ... OK
- echo $SRC_DIR/$test_dir/$test_name \
- >>$tmp.arglist
- else
- # oops
- echo "$t - unknown test, ignored"
- fi
- done
- ;;
- esac
-
- shift
- done
-elif [ -z "$GROUP_LIST" ]; then
- # default group list is the auto group. If any other group or test is
- # specified, we use that instead.
- GROUP_LIST="auto"
-fi
-
if [ `id -u` -ne 0 ]
then
_fatal "check: QA must be run as root"
--
2.54.0
^ permalink raw reply related [flat|nested] 5+ messages in thread