From a1d668c3ffd38d611f8446615e8f797dcfdfc397 Mon Sep 17 00:00:00 2001 From: Namhyung Kim Date: Wed, 3 Oct 2012 00:21:32 +0900 Subject: perf tools: Check existence of _get_comp_words_by_ref when bash completing The '_get_comp_words_by_ref' function is available from the bash completion v1.2 so that earlier version emits following warning: $ perf re_get_comp_words_by_ref: command not found Use older '_get_cword' method when the above function doesn't exist. Signed-off-by: Namhyung Kim Acked-by: Frederic Weisbecker Cc: David Ahern Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Peter Zijlstra Link: http://lkml.kernel.org/r/1349191294-6926-2-git-send-email-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/bash_completion | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'tools/perf/bash_completion') diff --git a/tools/perf/bash_completion b/tools/perf/bash_completion index 1958fa539d0..3d48cee1b5e 100644 --- a/tools/perf/bash_completion +++ b/tools/perf/bash_completion @@ -1,12 +1,23 @@ # perf completion +function_exists() +{ + declare -F $1 > /dev/null + return $? +} + have perf && _perf() { - local cur cmd + local cur prev cmd COMPREPLY=() - _get_comp_words_by_ref cur prev + if function_exists _get_comp_words_by_ref; then + _get_comp_words_by_ref cur prev + else + cur=$(_get_cword) + prev=${COMP_WORDS[COMP_CWORD-1]} + fi cmd=${COMP_WORDS[0]} -- cgit v1.2.3-70-g09d2 From 35c2fde1155cc7225361edf43d8efd0aabd28a0c Mon Sep 17 00:00:00 2001 From: Namhyung Kim Date: Wed, 3 Oct 2012 00:21:33 +0900 Subject: perf tools: Complete long option names of perf command The main perf binary can receive a number of options that configure working environment. Add them to the completion script. Signed-off-by: Namhyung Kim Acked-by: Frederic Weisbecker Cc: David Ahern Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Peter Zijlstra Link: http://lkml.kernel.org/r/1349191294-6926-3-git-send-email-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/bash_completion | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'tools/perf/bash_completion') diff --git a/tools/perf/bash_completion b/tools/perf/bash_completion index 3d48cee1b5e..bef06f0deeb 100644 --- a/tools/perf/bash_completion +++ b/tools/perf/bash_completion @@ -21,10 +21,16 @@ _perf() cmd=${COMP_WORDS[0]} - # List perf subcommands + # List perf subcommands or long options if [ $COMP_CWORD -eq 1 ]; then - cmds=$($cmd --list-cmds) - COMPREPLY=( $( compgen -W '$cmds' -- "$cur" ) ) + if [[ $cur == --* ]]; then + COMPREPLY=( $( compgen -W '--help --version \ + --exec-path --html-path --paginate --no-pager \ + --perf-dir --work-tree --debugfs-dir' -- "$cur" ) ) + else + cmds=$($cmd --list-cmds) + COMPREPLY=( $( compgen -W '$cmds' -- "$cur" ) ) + fi # List possible events for -e option elif [[ $prev == "-e" && "${COMP_WORDS[1]}" == @(record|stat|top) ]]; then cmds=$($cmd list --raw-dump) -- cgit v1.2.3-70-g09d2 From 4d8061faca7a50010f037374410f0c3647c3ecf8 Mon Sep 17 00:00:00 2001 From: Namhyung Kim Date: Wed, 3 Oct 2012 00:21:34 +0900 Subject: 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 Acked-by: Frederic Weisbecker Cc: David Ahern Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Peter Zijlstra Link: http://lkml.kernel.org/r/1349191294-6926-4-git-send-email-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/bash_completion | 9 +++++++-- tools/perf/util/parse-options.c | 8 ++++++++ tools/perf/util/parse-options.h | 1 + 3 files changed, 16 insertions(+), 2 deletions(-) (limited to 'tools/perf/bash_completion') diff --git a/tools/perf/bash_completion b/tools/perf/bash_completion index bef06f0deeb..5c355ababf8 100644 --- a/tools/perf/bash_completion +++ b/tools/perf/bash_completion @@ -33,8 +33,13 @@ _perf() fi # List possible events for -e option elif [[ $prev == "-e" && "${COMP_WORDS[1]}" == @(record|stat|top) ]]; then - cmds=$($cmd list --raw-dump) - COMPREPLY=( $( compgen -W '$cmds' -- "$cur" ) ) + evts=$($cmd list --raw-dump) + COMPREPLY=( $( compgen -W '$evts' -- "$cur" ) ) + # List long option names + elif [[ $cur == --* ]]; then + subcmd=${COMP_WORDS[1]} + opts=$($cmd $subcmd --list-opts) + COMPREPLY=( $( compgen -W '$opts' -- "$cur" ) ) # Fall down to list regular files else _filedir diff --git a/tools/perf/util/parse-options.c b/tools/perf/util/parse-options.c index 443fc116512..2bc9e70df7e 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, return usage_with_options_internal(usagestr, options, 1); if (internal_help && !strcmp(arg + 2, "help")) return parse_options_usage(usagestr, options); + if (!strcmp(arg + 2, "list-opts")) + return PARSE_OPT_LIST; switch (parse_long_opt(ctx, arg + 2, options)) { case -1: return parse_options_usage(usagestr, options); @@ -422,6 +424,12 @@ int parse_options(int argc, const char **argv, const struct option *options, exit(129); case PARSE_OPT_DONE: break; + case PARSE_OPT_LIST: + while (options->type != OPTION_END) { + printf("--%s ", options->long_name); + options++; + } + exit(130); default: /* PARSE_OPT_UNKNOWN */ if (ctx.argv[0][1] == '-') { 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 abc31a1dac1..7bb5999940c 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, enum { PARSE_OPT_HELP = -1, PARSE_OPT_DONE, + PARSE_OPT_LIST, PARSE_OPT_UNKNOWN, }; -- cgit v1.2.3-70-g09d2 From ae0c1f993411d88bf54c9e20a4249ebcc7a041f9 Mon Sep 17 00:00:00 2001 From: Namhyung Kim Date: Thu, 4 Oct 2012 14:23:54 +0900 Subject: perf tools: Complete tracepoint event names Currently tracepoint events cannot be completed because they contain a colon (:) character. The colon is considered as a word separator when bash completion is done - variable COMP_WORDBREAKS contains colon - so if a word being completed contains a colon it can be a problem. Recent versions of bash completion provide -n switch to _get_comp_words_by_ref and __ltrim_colon_completions functions in order to resolve this issue. Copy the latter in case not exists. Signed-off-by: Namhyung Kim Cc: David Ahern Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Paul Mackerras Cc: Peter Zijlstra Link: http://lkml.kernel.org/r/1349328234-16995-1-git-send-email-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/bash_completion | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'tools/perf/bash_completion') diff --git a/tools/perf/bash_completion b/tools/perf/bash_completion index 5c355ababf8..56e6a12aab5 100644 --- a/tools/perf/bash_completion +++ b/tools/perf/bash_completion @@ -6,6 +6,19 @@ function_exists() return $? } +function_exists __ltrim_colon_completions || +__ltrim_colon_completions() +{ + if [[ "$1" == *:* && "$COMP_WORDBREAKS" == *:* ]]; then + # Remove colon-word prefix from COMPREPLY items + local colon_word=${1%${1##*:}} + local i=${#COMPREPLY[*]} + while [[ $((--i)) -ge 0 ]]; do + COMPREPLY[$i]=${COMPREPLY[$i]#"$colon_word"} + done + fi +} + have perf && _perf() { @@ -13,9 +26,9 @@ _perf() COMPREPLY=() if function_exists _get_comp_words_by_ref; then - _get_comp_words_by_ref cur prev + _get_comp_words_by_ref -n : cur prev else - cur=$(_get_cword) + cur=$(_get_cword :) prev=${COMP_WORDS[COMP_CWORD-1]} fi @@ -35,6 +48,7 @@ _perf() elif [[ $prev == "-e" && "${COMP_WORDS[1]}" == @(record|stat|top) ]]; then evts=$($cmd list --raw-dump) COMPREPLY=( $( compgen -W '$evts' -- "$cur" ) ) + __ltrim_colon_completions $cur # List long option names elif [[ $cur == --* ]]; then subcmd=${COMP_WORDS[1]} -- cgit v1.2.3-70-g09d2