[libvirt] [PATCH 1/5] Improve virsh autocompletion (extract parser)

Eric Blake eblake at redhat.com
Sun Mar 30 03:09:31 UTC 2014


On 03/29/2014 08:36 PM, Solly Ross wrote:
> This commit extracts the parsing logic from vshCommnadParse

s/Commnad/Command/

> so that it can be used by other methods.  The vshCommnadParse

and again

> method is designed to parse full commands and error out on
> unknown information, so it is not suitable to simply use it
> for autocompletion.  Instead, the logic has been extracted.
> 
> The new method essentially performs one pass of the loop previously
> done by vshCommnadParse.  Depending on what happens, instead of erroring

and again

> or continuing the loop, it returns a value from an enum indicating the
> current state.  It also modifieds several arguments as appropriate.

s/modifieds/modifies/

> 
> Then, a caller can choose to deal with the state, or may simply ignore
> the state when convinient (vshCommandParse deals with the state,

s/convinient/convenient/

> so as to continue providing its previous functionality, while a
> completer could choose to ingore states involving unknown options,

s/ingore/ignore/

> for example).
> ---
>  outgoing/0000-cover-letter.patch                   |   68 +
>  ...prove-virsh-autocompletion-extract-parser.patch |  428 ++++++
>  ...prove-virsh-autocompletion-base-framework.patch |  278 ++++
>  ...ve-virsh-autocompletion-global-ctl-object.patch |  116 ++
>  ...ove-virsh-autocompletion-domain-completer.patch | 1479 ++++++++++++++++++++
>  ...virsh-autocompletion-enum-completer-macro.patch |  131 ++

Ouch - these 6 files mistakenly got committed into your tree.  They
should not be part of this commit.  I'll push a patch to .gitignore to
overlook .patch files, but you'll need to amend your patch to drop these
additions.  Easiest might be to use 'git rebase -i', mark this patch as
'edit', then exit the editor to start the efforts.  From the shell, I
would then do 'git reset HEAD^' then 'git add tools/virsh.c' then 'git
rebase --continue' - it will preserve your commit message, but should
show just one file instead of 7 in the amended commit.

It's late for me today, so for now, this review is just high-level (I'm
not closely reading the code, just looking for obvious violations of
coding standards).

> diff --git a/tools/virsh.c b/tools/virsh.c
> index f2e4c4a..0273abe 100644
> --- a/tools/virsh.c
> +++ b/tools/virsh.c
> @@ -1110,7 +1110,7 @@ static vshCmdOptDef helpopt = {
>  };
>  static const vshCmdOptDef *
>  vshCmddefGetOption(vshControl *ctl, const vshCmdDef *cmd, const char *name,
> -                   uint32_t *opts_seen, int *opt_index, char **optstr)
> +                   uint32_t *opts_seen, int *opt_index, char **optstr, bool raise_err)

Please wrap this line to stay within 80 columns.


> +static vshLineExtractionState
> +vshExtractLinePart(vshControl *ctl, vshCommandParser *parser,
> +                   uint32_t *opts_seen, uint32_t *opts_need_arg,
> +                   char **tok_out, const vshCmdDef **cmd,
> +                   const vshCmdOptDef **opt, bool raise_err, int state)
> +{
> +    static bool data_only = false;
> +    static uint32_t opts_required = 0;

Explicit initialization of static variables to 0 is overkill; the C
standard already guarantees this.  Are these variables really necessary
to be saved across invocations of this function?


> +    } else if (tok_type == VSH_TK_SUBCMD_END) {
> +        *opt = NULL;
> +        //*cmd = NULL;

No // comments, please.


>  static bool
>  vshCommandParse(vshControl *ctl, vshCommandParser *parser)
>  {
>      char *tkdata = NULL;
>      vshCmd *clast = NULL;
>      vshCmdOpt *first = NULL;
> +    int state = 0;

Might as well type this with the appropriate enum type, instead of int.


> -                /* Special case 'help' to ignore spurious data */
> -                if (!(opt = vshCmddefGetData(cmd, &opts_need_arg,
> -                                             &opts_seen)) &&
> -                     STRNEQ(cmd->name, "help")) {
> -                    vshError(ctl, _("unexpected data '%s'"), tkdata);
> -                    goto syntaxError;
> +
> +                    if (!first)
> +                        first = arg;
> +                    if (last)
> +                        last->next = arg;
> +                    last = arg;
> +
> +                    vshDebug(ctl, VSH_ERR_INFO, "%s: %s(%s): %s\n",
> +                             cmd->name,
> +                             opt->name,
> +                             opt->type != VSH_OT_BOOL ? _("optdata") : _("bool"),
> +                             opt->type != VSH_OT_BOOL ? arg->data : _("(none)"));
>                  }
> -            }
> -            if (opt) {
> -                /* save option */
> -                vshCmdOpt *arg = vshMalloc(ctl, sizeof(vshCmdOpt));
> -
> -                arg->def = opt;
> -                arg->data = tkdata;
> -                arg->next = NULL;
> -                tkdata = NULL;
> -
> -                if (!first)
> -                    first = arg;
> -                if (last)
> -                    last->next = arg;
> -                last = arg;
> -
> -                vshDebug(ctl, VSH_ERR_INFO, "%s: %s(%s): %s\n",

Looks like a lot of reindentation.  I find it easier to split patches
like this into two parts - one that is just new content but wrong
indentation, and the other that is just whitespace changes.

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

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


More information about the libvir-list mailing list