Message ID | 20240104204614.1426027-3-pvorel@suse.cz |
---|---|
State | Changes Requested |
Headers | show |
Series | metadata: improvements | expand |
Hi! > +if [ $# -gt 0 ]; then > + tests=$* > +else > + tests=$(find testcases/ -name '*.c' | sort) > +fi This unfortunately does not work when there are unexpected characters in the paths. Which shouldn't happen unless you pass an absoulte path to the script which contains for example space. I do not think that we can safely pass a list in a variable without breaking it in that case. E.g. it works directly with $* or $@ if it's quoted properly as: for test in "$@"; do ... But as long as you pass $@ indirectly it breaks on spaces. Note that the subshell $() with find has the same problem, but there is much less room for breaking something because that is passed relative paths inside of LTP. And yes I hate argument parsing in shell.. > +for test in $tests; do > a=$($top_builddir/metadata/metaparse -Iinclude -Itestcases/kernel/syscalls/utils/ "$test") > if [ -n "$a" ]; then > if [ -z "$first" ]; then
HI Cyril, > Hi! > > +if [ $# -gt 0 ]; then > > + tests=$* > > +else > > + tests=$(find testcases/ -name '*.c' | sort) > > +fi > This unfortunately does not work when there are unexpected characters in > the paths. Which shouldn't happen unless you pass an absoulte path to > the script which contains for example space. Ah :(. > I do not think that we can safely pass a list in a variable without > breaking it in that case. E.g. it works directly with $* or $@ if it's > quoted properly as: > for test in "$@"; do > ... OK, we can either drop it entirely, or use something like this (I'm not happy about global): parse() { local test="$1" a=$($top_builddir/metadata/metaparse -Iinclude -Itestcases/kernel/syscalls/utils/ "$test") if [ -n "$a" ]; then if [ -z "$first" ]; then echo ',' fi first= cat <<EOF $a EOF fi } first=1 if [ $# -gt 0 ]; then for test in "$@"; do parse "$test" done else for test in $(find testcases/ -name '*.c' | sort); do parse "$test" done fi > But as long as you pass $@ indirectly it breaks on spaces. > Note that the subshell $() with find has the same problem, but there is > much less room for breaking something because that is passed relative > paths inside of LTP. > And yes I hate argument parsing in shell.. Yeah, we all love shell pitfalls :). Kind regards, Petr > > +for test in $tests; do > > a=$($top_builddir/metadata/metaparse -Iinclude -Itestcases/kernel/syscalls/utils/ "$test") > > if [ -n "$a" ]; then > > if [ -z "$first" ]; then
diff --git a/metadata/parse.sh b/metadata/parse.sh index 69bf5db65..9dd097153 100755 --- a/metadata/parse.sh +++ b/metadata/parse.sh @@ -2,6 +2,7 @@ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (c) 2019 Cyril Hrubis <chrubis@suse.cz> # Copyright (c) 2020 Petr Vorel <pvorel@suse.cz> +# Copyright (c) Linux Test Project, 2022-2024 set -e top_builddir=$PWD/.. @@ -29,7 +30,13 @@ echo ' "tests": {' first=1 -for test in `find testcases/ -name '*.c'|sort`; do +if [ $# -gt 0 ]; then + tests=$* +else + tests=$(find testcases/ -name '*.c' | sort) +fi + +for test in $tests; do a=$($top_builddir/metadata/metaparse -Iinclude -Itestcases/kernel/syscalls/utils/ "$test") if [ -n "$a" ]; then if [ -z "$first" ]; then
Signed-off-by: Petr Vorel <pvorel@suse.cz> --- metadata/parse.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)