[tip:perf/core] perf kvm: introduce --list-cmds for use by scripts
Commit-ID: 09a71b97cce70551356b13b668aa1d7d6da84457 Gitweb: http://git.kernel.org/tip/09a71b97cce70551356b13b668aa1d7d6da84457 Author: Ramkumar Ramachandra AuthorDate: Mon, 3 Mar 2014 20:26:36 -0500 Committer: Arnaldo Carvalho de Melo CommitDate: Fri, 14 Mar 2014 18:08:41 -0300 perf kvm: introduce --list-cmds for use by scripts Introduce $ perf kvm --list-cmds to dump a raw list of commands for use by the completion script. In order to do this, introduce parse_options_subcommand() for handling subcommands as a special case in the parse-options machinery. Signed-off-by: Ramkumar Ramachandra Acked-by: David Ahern Acked-by: Jiri Olsa Cc: David Ahern Link: http://lkml.kernel.org/r/1393896396-10427-1-git-send-email-artag...@gmail.com Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/builtin-kvm.c| 12 +--- tools/perf/perf-completion.sh | 2 +- tools/perf/util/parse-options.c | 37 + tools/perf/util/parse-options.h | 8 +++- 4 files changed, 46 insertions(+), 13 deletions(-) diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index a735051..21c164b 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -1691,17 +1691,15 @@ int cmd_kvm(int argc, const char **argv, const char *prefix __maybe_unused) OPT_END() }; - - const char * const kvm_usage[] = { - "perf kvm [] {top|record|report|diff|buildid-list|stat}", - NULL - }; + const char *const kvm_subcommands[] = { "top", "record", "report", "diff", + "buildid-list", "stat", NULL }; + const char *kvm_usage[] = { NULL, NULL }; perf_host = 0; perf_guest = 1; - argc = parse_options(argc, argv, kvm_options, kvm_usage, - PARSE_OPT_STOP_AT_NON_OPTION); + argc = parse_options_subcommand(argc, argv, kvm_options, kvm_subcommands, kvm_usage, + PARSE_OPT_STOP_AT_NON_OPTION); if (!argc) usage_with_options(kvm_usage, kvm_options); diff --git a/tools/perf/perf-completion.sh b/tools/perf/perf-completion.sh index 496e2ab..ae3a576 100644 --- a/tools/perf/perf-completion.sh +++ b/tools/perf/perf-completion.sh @@ -123,7 +123,7 @@ __perf_main () __perfcomp_colon "$evts" "$cur" # List subcommands for 'perf kvm' elif [[ $prev == "kvm" ]]; then - subcmds="top record report diff buildid-list stat" + subcmds=$($cmd $prev --list-cmds) __perfcomp_colon "$subcmds" "$cur" # List long option names elif [[ $cur == --* ]]; then diff --git a/tools/perf/util/parse-options.c b/tools/perf/util/parse-options.c index d22e3f8..bf48092 100644 --- a/tools/perf/util/parse-options.c +++ b/tools/perf/util/parse-options.c @@ -407,7 +407,9 @@ int parse_options_step(struct parse_opt_ctx_t *ctx, if (internal_help && !strcmp(arg + 2, "help")) return usage_with_options_internal(usagestr, options, 0); if (!strcmp(arg + 2, "list-opts")) - return PARSE_OPT_LIST; + return PARSE_OPT_LIST_OPTS; + if (!strcmp(arg + 2, "list-cmds")) + return PARSE_OPT_LIST_SUBCMDS; switch (parse_long_opt(ctx, arg + 2, options)) { case -1: return parse_options_usage(usagestr, options, arg + 2, 0); @@ -433,25 +435,45 @@ int parse_options_end(struct parse_opt_ctx_t *ctx) return ctx->cpidx + ctx->argc; } -int parse_options(int argc, const char **argv, const struct option *options, - const char * const usagestr[], int flags) +int parse_options_subcommand(int argc, const char **argv, const struct option *options, + const char *const subcommands[], const char *usagestr[], int flags) { struct parse_opt_ctx_t ctx; perf_header__set_cmdline(argc, argv); + /* build usage string if it's not provided */ + if (subcommands && !usagestr[0]) { + struct strbuf buf = STRBUF_INIT; + + strbuf_addf(, "perf %s [] {", argv[0]); + for (int i = 0; subcommands[i]; i++) { + if (i) + strbuf_addstr(, "|"); + strbuf_addstr(, subcommands[i]); + } + strbuf_addstr(, "}"); + + usagestr[0] = strdup(buf.buf); + strbuf_release(); + } + parse_options_start(, argc, argv, flags); switch (parse_options_step(, options, usagestr)) { case PARSE_OPT_HELP: exit(129); case PARSE_OPT_DONE: break; - case PARSE_OPT_LIST: + case PARSE_OPT_LIST_OPTS: while (options->type != OPTION_END) {
[tip:perf/core] perf kvm: introduce --list-cmds for use by scripts
Commit-ID: 09a71b97cce70551356b13b668aa1d7d6da84457 Gitweb: http://git.kernel.org/tip/09a71b97cce70551356b13b668aa1d7d6da84457 Author: Ramkumar Ramachandra artag...@gmail.com AuthorDate: Mon, 3 Mar 2014 20:26:36 -0500 Committer: Arnaldo Carvalho de Melo a...@redhat.com CommitDate: Fri, 14 Mar 2014 18:08:41 -0300 perf kvm: introduce --list-cmds for use by scripts Introduce $ perf kvm --list-cmds to dump a raw list of commands for use by the completion script. In order to do this, introduce parse_options_subcommand() for handling subcommands as a special case in the parse-options machinery. Signed-off-by: Ramkumar Ramachandra artag...@gmail.com Acked-by: David Ahern dsah...@gmail.com Acked-by: Jiri Olsa jo...@redhat.com Cc: David Ahern dsah...@gmail.com Link: http://lkml.kernel.org/r/1393896396-10427-1-git-send-email-artag...@gmail.com Signed-off-by: Arnaldo Carvalho de Melo a...@redhat.com --- tools/perf/builtin-kvm.c| 12 +--- tools/perf/perf-completion.sh | 2 +- tools/perf/util/parse-options.c | 37 + tools/perf/util/parse-options.h | 8 +++- 4 files changed, 46 insertions(+), 13 deletions(-) diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index a735051..21c164b 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -1691,17 +1691,15 @@ int cmd_kvm(int argc, const char **argv, const char *prefix __maybe_unused) OPT_END() }; - - const char * const kvm_usage[] = { - perf kvm [options] {top|record|report|diff|buildid-list|stat}, - NULL - }; + const char *const kvm_subcommands[] = { top, record, report, diff, + buildid-list, stat, NULL }; + const char *kvm_usage[] = { NULL, NULL }; perf_host = 0; perf_guest = 1; - argc = parse_options(argc, argv, kvm_options, kvm_usage, - PARSE_OPT_STOP_AT_NON_OPTION); + argc = parse_options_subcommand(argc, argv, kvm_options, kvm_subcommands, kvm_usage, + PARSE_OPT_STOP_AT_NON_OPTION); if (!argc) usage_with_options(kvm_usage, kvm_options); diff --git a/tools/perf/perf-completion.sh b/tools/perf/perf-completion.sh index 496e2ab..ae3a576 100644 --- a/tools/perf/perf-completion.sh +++ b/tools/perf/perf-completion.sh @@ -123,7 +123,7 @@ __perf_main () __perfcomp_colon $evts $cur # List subcommands for 'perf kvm' elif [[ $prev == kvm ]]; then - subcmds=top record report diff buildid-list stat + subcmds=$($cmd $prev --list-cmds) __perfcomp_colon $subcmds $cur # List long option names elif [[ $cur == --* ]]; then diff --git a/tools/perf/util/parse-options.c b/tools/perf/util/parse-options.c index d22e3f8..bf48092 100644 --- a/tools/perf/util/parse-options.c +++ b/tools/perf/util/parse-options.c @@ -407,7 +407,9 @@ int parse_options_step(struct parse_opt_ctx_t *ctx, if (internal_help !strcmp(arg + 2, help)) return usage_with_options_internal(usagestr, options, 0); if (!strcmp(arg + 2, list-opts)) - return PARSE_OPT_LIST; + return PARSE_OPT_LIST_OPTS; + if (!strcmp(arg + 2, list-cmds)) + return PARSE_OPT_LIST_SUBCMDS; switch (parse_long_opt(ctx, arg + 2, options)) { case -1: return parse_options_usage(usagestr, options, arg + 2, 0); @@ -433,25 +435,45 @@ int parse_options_end(struct parse_opt_ctx_t *ctx) return ctx-cpidx + ctx-argc; } -int parse_options(int argc, const char **argv, const struct option *options, - const char * const usagestr[], int flags) +int parse_options_subcommand(int argc, const char **argv, const struct option *options, + const char *const subcommands[], const char *usagestr[], int flags) { struct parse_opt_ctx_t ctx; perf_header__set_cmdline(argc, argv); + /* build usage string if it's not provided */ + if (subcommands !usagestr[0]) { + struct strbuf buf = STRBUF_INIT; + + strbuf_addf(buf, perf %s [options] {, argv[0]); + for (int i = 0; subcommands[i]; i++) { + if (i) + strbuf_addstr(buf, |); + strbuf_addstr(buf, subcommands[i]); + } + strbuf_addstr(buf, }); + + usagestr[0] = strdup(buf.buf); + strbuf_release(buf); + } + parse_options_start(ctx, argc, argv, flags); switch (parse_options_step(ctx, options, usagestr)) { case PARSE_OPT_HELP: exit(129); case PARSE_OPT_DONE: break; - case