[Libguestfs] [PATCH v2] fish: show synopsis if command syntax is wrong
Hu Tao
hutao at cn.fujitsu.com
Tue Dec 2 01:21:24 UTC 2014
On Mon, Dec 01, 2014 at 06:01:25PM +0000, Richard W.M. Jones wrote:
>
> How about the following? I've made it use a named value
> (RUN_WRONG_ARGS == -2) instead of just the magic number.
Yes, it looks better!
>
> Also I removed an incorrect hunk from the original patch (space before
> synopsis string is required).
The space before synopsis makes the text of synopsis misaligned. I don't
know why it's required, but if it does, the patch looks good to me.
Regards,
Hu
>
> Rich.
>
> --
> Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
> Read my programming and virtualization blog: http://rwmj.wordpress.com
> virt-top is 'top' for virtual machines. Tiny program with many
> powerful monitoring features, net stats, disk stats, logging, etc.
> http://people.redhat.com/~rjones/virt-top
> >From 4c65e5564c525e7b4ab5d3268f37547b853c0d03 Mon Sep 17 00:00:00 2001
> From: Hu Tao <hutao at cn.fujitsu.com>
> Date: Mon, 1 Dec 2014 18:26:12 +0800
> Subject: [PATCH] fish: show synopsis if command syntax is wrong
>
> This patch lets guestfish show command synopsis if the syntax of command issued
> by user is wrong, rather than telling user that the number of parameters is wrong.
>
> Signed-off-by: Hu Tao <hutao at cn.fujitsu.com>
> ---
> fish/cmds-gperf.h | 1 +
> generator/fish.ml | 48 +++++++++++++++++++++++++-----------------------
> 2 files changed, 26 insertions(+), 23 deletions(-)
>
> diff --git a/fish/cmds-gperf.h b/fish/cmds-gperf.h
> index 74db69d..bcb3b5d 100644
> --- a/fish/cmds-gperf.h
> +++ b/fish/cmds-gperf.h
> @@ -25,6 +25,7 @@
> struct command_entry {
> const char *name; /* Short name. */
> const char *help; /* Online help. */
> + const char *synopsis; /* Synopsis. */
>
> /* The run_* function. */
> int (*run) (const char *cmd, size_t argc, char *argv[]);
> diff --git a/generator/fish.ml b/generator/fish.ml
> index 3f53ffa..b609ce9 100644
> --- a/generator/fish.ml
> +++ b/generator/fish.ml
> @@ -98,6 +98,10 @@ let generate_fish_cmds () =
> pr "/* Valid suffixes allowed for numbers. See Gnulib xstrtol function. */\n";
> pr "static const char *xstrtol_suffixes = \"0kKMGTPEZY\";\n";
> pr "\n";
> + pr "/* Return these errors from run_* functions. */\n";
> + pr "#define RUN_ERROR -1\n";
> + pr "#define RUN_WRONG_ARGS -2\n";
> + pr "\n";
>
> List.iter (
> fun { name = name } ->
> @@ -129,6 +133,7 @@ let generate_fish_cmds () =
> pr "struct command_entry %s_cmd_entry = {\n" name;
> pr " .name = \"%s\",\n" name2;
> pr " .help = \"%s\",\n" (c_quote text);
> + pr " .synopsis = NULL,\n";
> pr " .run = run_%s\n" name;
> pr "};\n";
> pr "\n";
> @@ -190,6 +195,7 @@ Guestfish will prompt for these separately."
> pr "struct command_entry %s_cmd_entry = {\n" name;
> pr " .name = \"%s\",\n" name2;
> pr " .help = \"%s\",\n" (c_quote text);
> + pr " .synopsis = \"%s\",\n" (c_quote synopsis);
> pr " .run = run_%s\n" name;
> pr "};\n";
> pr "\n";
> @@ -337,7 +343,7 @@ Guestfish will prompt for these separately."
> pr "static int\n";
> pr "run_%s (const char *cmd, size_t argc, char *argv[])\n" name;
> pr "{\n";
> - pr " int ret = -1;\n";
> + pr " int ret = RUN_ERROR;\n";
> (match ret with
> | RErr
> | RInt _
> @@ -393,30 +399,14 @@ Guestfish will prompt for these separately."
>
> if argc_minimum = argc_maximum then (
> pr " if (argc != %d) {\n" argc_minimum;
> - if argc_minimum = 0 then (
> - pr " fprintf (stderr, _(\"%%s should have no parameters\\n\"), cmd);\n";
> - ) else (
> - pr " fprintf (stderr, ngettext(\"%%s should have %%d parameter\\n\",\n";
> - pr " \"%%s should have %%d parameters\\n\",\n";
> - pr " %d),\n"
> - argc_minimum;
> - pr " cmd, %d);\n"
> - argc_minimum;
> - )
> + pr " ret = RUN_WRONG_ARGS;\n";
> ) else if argc_minimum = 0 then (
> pr " if (argc > %d) {\n" argc_maximum;
> - pr " fprintf (stderr, ngettext(\"%%s should have at most %%d parameter\\n\",\n";
> - pr " \"%%s should have at most %%d parameters\\n\",\n";
> - pr " %d),\n"
> - argc_maximum;
> - pr " cmd, %d);\n"
> - argc_maximum;
> + pr " ret = RUN_WRONG_ARGS;\n";
> ) else (
> pr " if (argc < %d || argc > %d) {\n" argc_minimum argc_maximum;
> - pr " fprintf (stderr, _(\"%%s should have %%d-%%d parameter(s)\\n\"), cmd, %d, %d);\n"
> - argc_minimum argc_maximum;
> + pr " ret = RUN_WRONG_ARGS;\n";
> );
> - pr " fprintf (stderr, _(\"type 'help %%s' for help on %%s\\n\"), cmd, cmd);\n";
> pr " goto out_noargs;\n";
> pr " }\n";
>
> @@ -694,16 +684,28 @@ Guestfish will prompt for these separately."
> pr "run_action (const char *cmd, size_t argc, char *argv[])\n";
> pr "{\n";
> pr " const struct command_table *ct;\n";
> + pr " int ret = -1;\n";
> pr "\n";
> pr " ct = lookup_fish_command (cmd, strlen (cmd));\n";
> - pr " if (ct)\n";
> - pr " return ct->entry->run (cmd, argc, argv);\n";
> + pr " if (ct) {\n";
> + pr " ret = ct->entry->run (cmd, argc, argv);\n";
> + pr " /* run function may return magic value -2 (RUN_WRONG_ARGS) to indicate\n";
> + pr " * that this function should print the command synopsis.\n";
> + pr " */\n";
> + pr " if (ret == RUN_WRONG_ARGS) {\n";
> + pr " fprintf (stderr, _(\"error: incorrect number of arguments\\n\"));\n";
> + pr " if (ct->entry->synopsis)\n";
> + pr " fprintf (stderr, _(\"usage: %%s\\n\"), ct->entry->synopsis);\n";
> + pr " fprintf (stderr, _(\"type 'help %%s' for more help on %%s\\n\"), cmd, cmd);\n";
> + pr " ret = -1;\n";
> + pr " }\n";
> + pr " }\n";
> pr " else {\n";
> pr " fprintf (stderr, _(\"%%s: unknown command\\n\"), cmd);\n";
> pr " if (command_num == 1)\n";
> pr " extended_help_message ();\n";
> - pr " return -1;\n";
> pr " }\n";
> + pr " return ret;\n";
> pr "}\n"
>
> and generate_fish_cmds_h () =
> --
> 2.1.0
>
More information about the Libguestfs
mailing list