From: Jeff King <peff@peff.net>
To: Matheus Tavares <matheus.bernardino@usp.br>
Cc: git@vger.kernel.org, gitster@pobox.com,
"SZEDER Gábor" <szeder.dev@gmail.com>,
"Johannes Schindelin" <Johannes.Schindelin@gmx.de>
Subject: Re: [PATCH] test-lib: allow short options to be stacked
Date: Sat, 21 Mar 2020 02:26:11 -0400 [thread overview]
Message-ID: <20200321062611.GA1441446@coredump.intra.peff.net> (raw)
In-Reply-To: <48c28683412e3e0803d4c7189a6d66daddcdc580.1584759277.git.matheus.bernardino@usp.br>
On Sat, Mar 21, 2020 at 12:07:05AM -0300, Matheus Tavares wrote:
> When debugging a test (or a set of tests), it's common to execute it
> with some combination of short options, such as:
>
> $ ./txxx-testname.sh -d -x -i
>
> In cases like this, CLIs usually allow the short options to be stacked
> in a single argument, for convenience and agility. Let's add this
> feature to test-lib, allowing the above command to be run as:
>
> $ ./txxx-testname.sh -dxi
> (or any other permutation, e.g. '-ixd')
Yay. I've grown accustomed to the lack of this feature in the test
scripts, but I'll be happy to have it. :)
Most getopt implementations I've seen call this "bundling" rather than
"stacking" (I don't care too much either way, but Junio mentioned being
confused at the name).
> + case "$opt" in
> + --*)
> + parse_option "$opt" ;;
> + -?*)
> + # stacked short options must be fed separately to parse_option
> + for c in $(echo "${opt#-}" | sed 's/./& /g')
> + do
> + parse_option "-$c"
> + done
I wondered if we could do this without the extra process. This works:
opt=${opt#-}
while test -n "$opt"
do
extra=${opt#?}
this=${opt%$extra}
opt=$extra
parse_option "-$this"
done
It's a little convoluted. I'm not sure if saving a process per unbundled
short option is worth it.
What happens to bundled short options with arguments? I think "-r" is
the only one. We don't allow "stuck" short options like "-r5", so we
don't have to worry about feeding non-option bits to parse_option(). It
looks like we'd only examine $store_arg_to outside of the short-option
loop, so we'd treat:
./t1234-foo.sh -vrix 5
the same as:
./t1234-foo.sh -v -r 5 -i -x
which seems reasonable. But:
./t1234-foo.sh -rr 5 6
would get garbled. We'd come out of "-rr" parsing with $store_arg_to
set, but only grab the first argument. I think I could live with that,
considering this is just the test scripts. Fixing it would require
store_arg_to becoming a space-separated list.
-Peff
next prev parent reply other threads:[~2020-03-21 6:26 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-21 3:07 [PATCH] test-lib: allow short options to be stacked Matheus Tavares
2020-03-21 4:53 ` Junio C Hamano
2020-03-21 17:27 ` Matheus Tavares
2020-03-21 6:26 ` Jeff King [this message]
2020-03-21 18:50 ` Matheus Tavares Bernardino
2020-03-22 6:49 ` Jeff King
2020-03-22 8:14 ` SZEDER Gábor
2020-03-21 18:57 ` Junio C Hamano
2020-03-21 8:55 ` Johannes Sixt
2020-03-21 18:55 ` Matheus Tavares Bernardino
2020-03-21 20:11 ` Junio C Hamano
2020-03-21 19:57 ` [PATCH v2] test-lib: allow short options to be bundled Matheus Tavares
2020-03-21 20:07 ` Junio C Hamano
2020-03-21 22:42 ` Matheus Tavares Bernardino
2020-03-22 15:58 ` [PATCH v3] " Matheus Tavares
2020-03-23 20:18 ` Junio C Hamano
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=20200321062611.GA1441446@coredump.intra.peff.net \
--to=peff@peff.net \
--cc=Johannes.Schindelin@gmx.de \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=matheus.bernardino@usp.br \
--cc=szeder.dev@gmail.com \
/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;
as well as URLs for NNTP newsgroup(s).