[Libguestfs] [nbdkit PATCH] maint: Improve ./nbdkit handling of --opt=value
Richard W.M. Jones
rjones at redhat.com
Wed Jan 24 14:16:11 UTC 2018
On Tue, Jan 23, 2018 at 09:58:27PM -0600, Eric Blake wrote:
> Although useful for in-tree debugging, the ./nbdkit script was not
> very nice when it comes to using the '--longopt=value' single-string
> form of options, compared to the two-string '--longopt value' form.
> Since we used a glob for the multiple spellings of --exportname and
> --pidfile, the script would try to treat the next argument literally
> instead of recognizing that the argument was already consumed.
> Likewise, the script was not recognizing '--filter=foo'.
Right, this is the reason why all the tests use ‘--filter foo’, which
is annoying and awkward.
> Since the script already relies on bash, we can exploit bash's
> case fallthrough (using ';&' instead of ';;'), to rewrite inline
> --filter=foo without having to duplicate logic.
Nice, I learn a new thing every day ...
> This does NOT try to honor option abbreviations. If you are testing
> that aspect of getopt_long, don't use this script ;)
>
> Signed-off-by: Eric Blake <eblake at redhat.com>
> ---
>
> I'm pushing this one now, as it tripped me up during testing.
>
> nbdkit.in | 10 ++++++++++
> 1 file changed, 10 insertions(+)
>
> diff --git a/nbdkit.in b/nbdkit.in
> index d1caf57..996616d 100644
> --- a/nbdkit.in
> +++ b/nbdkit.in
> @@ -65,6 +65,11 @@ verbose=
> while [ $# -gt 0 ]; do
> case "$1" in
> # Flags that take an argument. We must not rewrite the argument.
> + # But make sure globs don't mishandle longopts with =.
> + --export*=* | --pid*=*)
> + args[$i]="$1"
> + shift
> + ;;
> -e | --export* | -g | --group | -i | --ip* | -P | --pid* | -p | --port | --run | --selinux-label | -t | --threads | --tls | --tls-certificates | -U | --unix | -u | --user)
> args[$i]="$1"
> ((++i))
> @@ -80,6 +85,11 @@ while [ $# -gt 0 ]; do
> ;;
>
> # Filters can be rewritten if purely alphanumeric.
> + --filter=*)
> + tmp=${1#*=}
> + shift
> + set - --filter "$tmp" "$@"
> + ;& # fallthru
> --filter)
> args[$i]="--filter"
> ((++i))
Yup, this is great, ACK.
You might also want to adjust the tests to use ‘--filter=foo’ (no need
to review that change).
Rich.
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-df lists disk usage of guests without needing to install any
software inside the virtual machine. Supports Linux and Windows.
http://people.redhat.com/~rjones/virt-df/
More information about the Libguestfs
mailing list