[libvirt] [PATCH 2/4] virsh: Extend virsh commands definition with completer

Eric Blake eblake at redhat.com
Tue Jul 5 23:18:49 UTC 2011

On 07/04/2011 02:41 AM, Michal Privoznik wrote:
> This commit introduces command-based completer. Any command can now have
> a completer, which will generate additional command arguments. Completer
> is called repeatedly until it returns NULL. On the first call, @state is
> non-zero.

Don't you mean that on the first call, state is 0, and on subsequent
calls, it is 1?

> ---
>  tools/virsh.c |  364 ++++++++++++++++++++++++++++++---------------------------
>  1 files changed, 193 insertions(+), 171 deletions(-)
> diff --git a/tools/virsh.c b/tools/virsh.c
> index eeacec3..3dabb10 100644
> --- a/tools/virsh.c
> +++ b/tools/virsh.c
> @@ -202,6 +202,7 @@ typedef struct {
>      const vshCmdOptDef *opts;   /* definition of command options */
>      const vshCmdInfo *info;     /* details about command */
>      int flags;                  /* bitwise OR of VSH_CMD_FLAG */
> +    char * (*completer) (const char *, int);    /* command completer */
>  } vshCmdDef;

I'm still not convinced that this is the best approach.  Let's look at
patch 3/4, where one of the commands you changed was virsh
attach-device, to use the listAllDomains completer:

>      {"attach-device", cmdAttachDevice, opts_attach_device,
> -     info_attach_device, 0, NULL},
> +     info_attach_device, 0, complt_listAllDomains},

But attach-device has this synopsis:

    attach-device <domain> <file> [--persistent]

That means, if I type:

attach-device d<TAB>

I get a list of all domains starting with d.  But if I type:

attach-device domain f<TAB>

I would _still_ get a list of all domains starting with f, when what I
_really_ want at that point is a list of a files in the current
directory starting with f.

Furthermore, if I type:

attach-device -<TAB>

I do _not_ get any indication that --domain, --file, or --persistent are
also valid things to type at that point in the command, rather, it tries
to give me a list of all domains starting with '-', even though to
actually use such a domain, I would have to type an extra '--':

attach-device -- -odd-domain

Whereas if you go with my suggestion of having typed parameters, then
attach-device does _not_ need a custom completer.  Rather, it marks that
the 'domain' option is a VSH_OT_DOMAIN_ALL, and the 'file' option is a

attach-device d<TAB>

says that since the argument does not start with '-', it must be the
first data argument - and that data argument is typed VSH_OT_DOMAIN_ALL,
so call complt_listDomainsFlags to get that list. Likewise,

attach-device domain f<TAB>

says that since we have already parsed an argument, the next argument
must belong to the 'file' option, and we can use the normal readline
file completion hook.  Meanwhile,

attach-device -<TAB>

can see that the only valid thing here is an option name, and can thus
cycle through the valid remaining options, to return the list
'--domain', '--file', '--persistent'.  And putting it all together,

attach-device <TAB>

can output the merged list of '--domain', '--file', '--persistent', as
well as all domain names except for those that begin with '-'.

At this point, I'm not seeing any utility in a per-function completer,
when compared to a more generic utility in a per-option completer.

Eric Blake   eblake at redhat.com    +1-801-349-2682
Libvirt virtualization library http://libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 619 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20110705/8f261792/attachment-0001.sig>

More information about the libvir-list mailing list