2012-10-02 15:22:45

by Namhyung Kim

[permalink] [raw]
Subject: [PATCH 0/3] perf tools: Bash completion update

Hi,

This patchset improves bash completion support for perf tools. Some
option names are really painful to type so here comes a support for
completing those long option names. But I still think the
--showcpuutilization option needs to be renamed (at least adding a
couple of dashes in it).

Thanks,
Namhyung


Namhyung Kim (3):
perf tools: Check existence of _get_comp_words_by_ref when bash completing
perf tools: Complete long option names of perf command
perf tools: Long option completion support for each subcommands

tools/perf/bash_completion | 36 +++++++++++++++++++++++++++++-------
tools/perf/util/parse-options.c | 8 ++++++++
tools/perf/util/parse-options.h | 1 +
3 files changed, 38 insertions(+), 7 deletions(-)

--
1.7.9.2


2012-10-02 15:22:52

by Namhyung Kim

[permalink] [raw]
Subject: [PATCH 1/3] 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<TAB>_get_comp_words_by_ref: command not found

Use older '_get_cword' method when the above function doesn't exist.

Cc: Frederic Weisbecker <[email protected]>
Cc: David Ahern <[email protected]>
Signed-off-by: Namhyung Kim <[email protected]>
---
tools/perf/bash_completion | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/tools/perf/bash_completion b/tools/perf/bash_completion
index 1958fa539d0f..3d48cee1b5e5 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]}

--
1.7.9.2

2012-10-02 15:22:57

by Namhyung Kim

[permalink] [raw]
Subject: [PATCH 3/3] 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.

Cc: Frederic Weisbecker <[email protected]>
Cc: David Ahern <[email protected]>
Signed-off-by: Namhyung Kim <[email protected]>
---
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(-)

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()
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 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,
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 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,
enum {
PARSE_OPT_HELP = -1,
PARSE_OPT_DONE,
+ PARSE_OPT_LIST,
PARSE_OPT_UNKNOWN,
};

--
1.7.9.2

2012-10-02 15:23:22

by Namhyung Kim

[permalink] [raw]
Subject: [PATCH 2/3] 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.

Cc: Frederic Weisbecker <[email protected]>
Cc: David Ahern <[email protected]>
Signed-off-by: Namhyung Kim <[email protected]>
---
tools/perf/bash_completion | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/tools/perf/bash_completion b/tools/perf/bash_completion
index 3d48cee1b5e5..bef06f0deeb5 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)
--
1.7.9.2

2012-10-02 15:54:19

by Frederic Weisbecker

[permalink] [raw]
Subject: Re: [PATCH 1/3] perf tools: Check existence of _get_comp_words_by_ref when bash completing

On Wed, Oct 03, 2012 at 12:21:32AM +0900, Namhyung Kim wrote:
> The '_get_comp_words_by_ref' function is available from the bash
> completion v1.2 so that earlier version emits following warning:
>
> $ perf re<TAB>_get_comp_words_by_ref: command not found
>
> Use older '_get_cword' method when the above function doesn't exist.

May be only use _get_cword then, if it works everywhere?

>
> Cc: Frederic Weisbecker <[email protected]>
> Cc: David Ahern <[email protected]>
> Signed-off-by: Namhyung Kim <[email protected]>
> ---
> tools/perf/bash_completion | 15 +++++++++++++--
> 1 file changed, 13 insertions(+), 2 deletions(-)
>
> diff --git a/tools/perf/bash_completion b/tools/perf/bash_completion
> index 1958fa539d0f..3d48cee1b5e5 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]}
>
> --
> 1.7.9.2
>

2012-10-02 16:01:17

by Frederic Weisbecker

[permalink] [raw]
Subject: Re: [PATCH 0/3] perf tools: Bash completion update

On Wed, Oct 03, 2012 at 12:21:31AM +0900, Namhyung Kim wrote:
> Hi,
>
> This patchset improves bash completion support for perf tools. Some
> option names are really painful to type so here comes a support for
> completing those long option names. But I still think the
> --showcpuutilization option needs to be renamed (at least adding a
> couple of dashes in it).
>
> Thanks,
> Namhyung

Acked-by: Frederic Weisbecker <[email protected]>

Thanks Namhyung!

>
>
> Namhyung Kim (3):
> perf tools: Check existence of _get_comp_words_by_ref when bash completing
> perf tools: Complete long option names of perf command
> perf tools: Long option completion support for each subcommands
>
> tools/perf/bash_completion | 36 +++++++++++++++++++++++++++++-------
> tools/perf/util/parse-options.c | 8 ++++++++
> tools/perf/util/parse-options.h | 1 +
> 3 files changed, 38 insertions(+), 7 deletions(-)
>
> --
> 1.7.9.2
>

2012-10-04 01:52:38

by Namhyung Kim

[permalink] [raw]
Subject: Re: [PATCH 1/3] perf tools: Check existence of _get_comp_words_by_ref when bash completing

Hi Frederic,

On Tue, 2 Oct 2012 17:54:10 +0200, Frederic Weisbecker wrote:
> On Wed, Oct 03, 2012 at 12:21:32AM +0900, Namhyung Kim wrote:
>> The '_get_comp_words_by_ref' function is available from the bash
>> completion v1.2 so that earlier version emits following warning:
>>
>> $ perf re<TAB>_get_comp_words_by_ref: command not found
>>
>> Use older '_get_cword' method when the above function doesn't exist.
>
> May be only use _get_cword then, if it works everywhere?

It'll work but it's deprecated.

Thanks,
Namhyung

2012-10-04 08:44:47

by Frederic Weisbecker

[permalink] [raw]
Subject: Re: [PATCH 1/3] perf tools: Check existence of _get_comp_words_by_ref when bash completing

On Thu, Oct 04, 2012 at 10:43:03AM +0900, Namhyung Kim wrote:
> Hi Frederic,
>
> On Tue, 2 Oct 2012 17:54:10 +0200, Frederic Weisbecker wrote:
> > On Wed, Oct 03, 2012 at 12:21:32AM +0900, Namhyung Kim wrote:
> >> The '_get_comp_words_by_ref' function is available from the bash
> >> completion v1.2 so that earlier version emits following warning:
> >>
> >> $ perf re<TAB>_get_comp_words_by_ref: command not found
> >>
> >> Use older '_get_cword' method when the above function doesn't exist.
> >
> > May be only use _get_cword then, if it works everywhere?
>
> It'll work but it's deprecated.

Ok.

2012-10-05 08:52:55

by Namhyung Kim

[permalink] [raw]
Subject: [tip:perf/urgent] perf tools: Check existence of _get_comp_words_by_ref when bash completing

Commit-ID: a1d668c3ffd38d611f8446615e8f797dcfdfc397
Gitweb: http://git.kernel.org/tip/a1d668c3ffd38d611f8446615e8f797dcfdfc397
Author: Namhyung Kim <[email protected]>
AuthorDate: Wed, 3 Oct 2012 00:21:32 +0900
Committer: Arnaldo Carvalho de Melo <[email protected]>
CommitDate: Tue, 2 Oct 2012 18:36:42 -0300

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<TAB>_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 <[email protected]>
Acked-by: Frederic Weisbecker <[email protected]>
Cc: David Ahern <[email protected]>
Cc: Frederic Weisbecker <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
---
tools/perf/bash_completion | 15 +++++++++++++--
1 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/tools/perf/bash_completion b/tools/perf/bash_completion
index 1958fa5..3d48cee 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]}

2012-10-05 08:53:53

by Namhyung Kim

[permalink] [raw]
Subject: [tip:perf/urgent] perf tools: Complete long option names of perf command

Commit-ID: 35c2fde1155cc7225361edf43d8efd0aabd28a0c
Gitweb: http://git.kernel.org/tip/35c2fde1155cc7225361edf43d8efd0aabd28a0c
Author: Namhyung Kim <[email protected]>
AuthorDate: Wed, 3 Oct 2012 00:21:33 +0900
Committer: Arnaldo Carvalho de Melo <[email protected]>
CommitDate: Tue, 2 Oct 2012 18:36:43 -0300

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 <[email protected]>
Acked-by: Frederic Weisbecker <[email protected]>
Cc: David Ahern <[email protected]>
Cc: Frederic Weisbecker <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
---
tools/perf/bash_completion | 12 +++++++++---
1 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/tools/perf/bash_completion b/tools/perf/bash_completion
index 3d48cee..bef06f0 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)

2012-10-05 08:54:55

by Namhyung Kim

[permalink] [raw]
Subject: [tip:perf/urgent] perf tools: Long option completion support for each subcommands

Commit-ID: 4d8061faca7a50010f037374410f0c3647c3ecf8
Gitweb: http://git.kernel.org/tip/4d8061faca7a50010f037374410f0c3647c3ecf8
Author: Namhyung Kim <[email protected]>
AuthorDate: Wed, 3 Oct 2012 00:21:34 +0900
Committer: Arnaldo Carvalho de Melo <[email protected]>
CommitDate: Tue, 2 Oct 2012 18:36:44 -0300

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 <[email protected]>
Acked-by: Frederic Weisbecker <[email protected]>
Cc: David Ahern <[email protected]>
Cc: Frederic Weisbecker <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
---
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(-)

diff --git a/tools/perf/bash_completion b/tools/perf/bash_completion
index bef06f0..5c355ab 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 443fc11..2bc9e70 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 abc31a1..7bb5999 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,
};