From: Zorro Lang <zlang@kernel.org>
To: fstests@vger.kernel.org
Cc: Theodore Ts'o <tytso@mit.edu>
Subject: [RFC PATCH 1/4] check: refactor argument parsing with getopt
Date: Tue, 12 May 2026 21:25:36 +0800 [thread overview]
Message-ID: <20260512132539.931482-2-zlang@kernel.org> (raw)
In-Reply-To: <20260512132539.931482-1-zlang@kernel.org>
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
next prev parent reply other threads:[~2026-05-12 13:25 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-12 13:25 [RFC PATCH 0/4] Rewrite the check argument parsing Zorro Lang
2026-05-12 13:25 ` Zorro Lang [this message]
2026-05-12 13:25 ` [RFC PATCH 2/4] check: update usage and README to reflect new " 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
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260512132539.931482-2-zlang@kernel.org \
--to=zlang@kernel.org \
--cc=fstests@vger.kernel.org \
--cc=tytso@mit.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox