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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.