aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorNamhyung Kim <namhyung@kernel.org>2012-10-02 11:21:34 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2012-10-02 17:36:44 -0400
commit4d8061faca7a50010f037374410f0c3647c3ecf8 (patch)
tree820c67bbdd04d129826888aef56ddf18a6cd516e /tools
parent35c2fde1155cc7225361edf43d8efd0aabd28a0c (diff)
perf tools: Long option completion support for each subcommands
Add internal --list-opts option to print all of long option names to stdout so that it can be used for bash completion engine. Signed-off-by: Namhyung Kim <namhyung@kernel.org> Acked-by: Frederic Weisbecker <fweisbec@gmail.com> Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/1349191294-6926-4-git-send-email-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools')
-rw-r--r--tools/perf/bash_completion9
-rw-r--r--tools/perf/util/parse-options.c8
-rw-r--r--tools/perf/util/parse-options.h1
3 files changed, 16 insertions, 2 deletions
diff --git a/tools/perf/bash_completion b/tools/perf/bash_completion
index bef06f0deeb5..5c355ababf80 100644
--- a/tools/perf/bash_completion
+++ b/tools/perf/bash_completion
@@ -33,8 +33,13 @@ _perf()
33 fi 33 fi
34 # List possible events for -e option 34 # List possible events for -e option
35 elif [[ $prev == "-e" && "${COMP_WORDS[1]}" == @(record|stat|top) ]]; then 35 elif [[ $prev == "-e" && "${COMP_WORDS[1]}" == @(record|stat|top) ]]; then
36 cmds=$($cmd list --raw-dump) 36 evts=$($cmd list --raw-dump)
37 COMPREPLY=( $( compgen -W '$cmds' -- "$cur" ) ) 37 COMPREPLY=( $( compgen -W '$evts' -- "$cur" ) )
38 # List long option names
39 elif [[ $cur == --* ]]; then
40 subcmd=${COMP_WORDS[1]}
41 opts=$($cmd $subcmd --list-opts)
42 COMPREPLY=( $( compgen -W '$opts' -- "$cur" ) )
38 # Fall down to list regular files 43 # Fall down to list regular files
39 else 44 else
40 _filedir 45 _filedir
diff --git a/tools/perf/util/parse-options.c b/tools/perf/util/parse-options.c
index 443fc116512b..2bc9e70df7e2 100644
--- a/tools/perf/util/parse-options.c
+++ b/tools/perf/util/parse-options.c
@@ -384,6 +384,8 @@ int parse_options_step(struct parse_opt_ctx_t *ctx,
384 return usage_with_options_internal(usagestr, options, 1); 384 return usage_with_options_internal(usagestr, options, 1);
385 if (internal_help && !strcmp(arg + 2, "help")) 385 if (internal_help && !strcmp(arg + 2, "help"))
386 return parse_options_usage(usagestr, options); 386 return parse_options_usage(usagestr, options);
387 if (!strcmp(arg + 2, "list-opts"))
388 return PARSE_OPT_LIST;
387 switch (parse_long_opt(ctx, arg + 2, options)) { 389 switch (parse_long_opt(ctx, arg + 2, options)) {
388 case -1: 390 case -1:
389 return parse_options_usage(usagestr, options); 391 return parse_options_usage(usagestr, options);
@@ -422,6 +424,12 @@ int parse_options(int argc, const char **argv, const struct option *options,
422 exit(129); 424 exit(129);
423 case PARSE_OPT_DONE: 425 case PARSE_OPT_DONE:
424 break; 426 break;
427 case PARSE_OPT_LIST:
428 while (options->type != OPTION_END) {
429 printf("--%s ", options->long_name);
430 options++;
431 }
432 exit(130);
425 default: /* PARSE_OPT_UNKNOWN */ 433 default: /* PARSE_OPT_UNKNOWN */
426 if (ctx.argv[0][1] == '-') { 434 if (ctx.argv[0][1] == '-') {
427 error("unknown option `%s'", ctx.argv[0] + 2); 435 error("unknown option `%s'", ctx.argv[0] + 2);
diff --git a/tools/perf/util/parse-options.h b/tools/perf/util/parse-options.h
index abc31a1dac1a..7bb5999940ca 100644
--- a/tools/perf/util/parse-options.h
+++ b/tools/perf/util/parse-options.h
@@ -140,6 +140,7 @@ extern NORETURN void usage_with_options(const char * const *usagestr,
140enum { 140enum {
141 PARSE_OPT_HELP = -1, 141 PARSE_OPT_HELP = -1,
142 PARSE_OPT_DONE, 142 PARSE_OPT_DONE,
143 PARSE_OPT_LIST,
143 PARSE_OPT_UNKNOWN, 144 PARSE_OPT_UNKNOWN,
144}; 145};
145 146