From: Simon Marchi Date: Tue, 13 Aug 2013 20:26:24 +0000 (-0400) Subject: Update bash completion X-Git-Tag: v2.3.0-rc3~25 X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=ba28686d644c949b91fba24738c645a62ca26286;p=lttng-tools.git Update bash completion - Refactor options completion to remove a little bit of code duplication. - Add subcommand completion for the snapshot command. It is not perfect, but it's a start. - Add some comments to functions here and there. Signed-off-by: Simon Marchi Signed-off-by: David Goulet --- diff --git a/extras/lttng-bash_completion b/extras/lttng-bash_completion index d5a58f38d..f5677e9bc 100644 --- a/extras/lttng-bash_completion +++ b/extras/lttng-bash_completion @@ -15,6 +15,7 @@ # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # +# Generates COMPREPLY with the existing session names _lttng_complete_sessions() { # TODO # This code does nothing for now. When there is a mecanism to get the @@ -25,9 +26,18 @@ _lttng_complete_sessions() { return } +# Generates COMPREPLY with whatever is in the $options variable. +_lttng_complete_options() { + COMPREPLY=( $(compgen -W "${options}" -- $cur) ) +} + +# Generates COMPREPLY with whatever is in the $commands variable. +_lttng_complete_commands() { + COMPREPLY=( $(compgen -W "${commands}" -- $cur) ) +} + _lttng_cmd_addcontext() { - local add_context_opts - add_context_opts=$(lttng add-context --list-options) + options=$(lttng add-context --list-options) case $prev in --session|-s) @@ -44,26 +54,25 @@ _lttng_cmd_addcontext() { case $cur in -*) - COMPREPLY=( $(compgen -W "${add_context_opts}" -- $cur) ) + _lttng_complete_options return ;; esac } _lttng_cmd_calibrate() { - local calibrate_opts - calibrate_opts=$(lttng calibrate --list-options) + options=$(lttng calibrate --list-options) case $cur in -*) - COMPREPLY=( $(compgen -W "${calibrate_opts}" -- $cur) ) + _lttng_complete_options + return ;; esac } _lttng_cmd_create() { - local create_opts - create_opts=$(lttng create --list-options) + options=$(lttng create --list-options) case $prev in --output|-o) @@ -74,28 +83,28 @@ _lttng_cmd_create() { case $cur in -*) - COMPREPLY=( $(compgen -W "${create_opts}" -- $cur) ) + _lttng_complete_options return ;; esac } _lttng_cmd_destroy() { - local destroy_opts - destroy_opts=$(lttng destroy --list-options) + options=$(lttng destroy --list-options) case $cur in -*) - COMPREPLY=( $(compgen -W "${destroy_opts}" -- $cur) ) + _lttng_complete_options + return ;; *) _lttng_complete_sessions + return ;; esac } _lttng_cmd_disablechannel() { - local disable_channel_opts - disable_channel_opts=$(lttng disable-channel --list-options) + options=$(lttng disable-channel --list-options) case $prev in --session|-s) @@ -106,14 +115,13 @@ _lttng_cmd_disablechannel() { case $cur in -*) - COMPREPLY=( $(compgen -W "${disable_channel_opts}" -- $cur) ) + _lttng_complete_options return ;; esac } _lttng_cmd_disableevent() { - local disable_event_opts - disable_event_opts=$(lttng disable-event --list-options) + options=$(lttng disable-event --list-options) case $prev in --session|-s) @@ -127,15 +135,14 @@ _lttng_cmd_disableevent() { case $cur in -*) - COMPREPLY=( $(compgen -W "${disable_event_opts}" -- $cur) ) + _lttng_complete_options return ;; esac } _lttng_cmd_enablechannel() { - local enable_channel_opts - enable_channel_opts=$(lttng enable-channel --list-options) + options=$(lttng enable-channel --list-options) case $prev in --session|-s) @@ -146,15 +153,14 @@ _lttng_cmd_enablechannel() { case $cur in -*) - COMPREPLY=( $(compgen -W "${enable_channel_opts}" -- $cur) ) + _lttng_complete_options return ;; esac } _lttng_cmd_enableevent() { - local enable_event_opts - enable_event_opts=$(lttng enable-event --list-options) + options=$(lttng enable-event --list-options) case $prev in --session|-s) @@ -174,15 +180,14 @@ _lttng_cmd_enableevent() { case $cur in -*) - COMPREPLY=( $(compgen -W "${enable_event_opts}" -- $cur) ) + _lttng_complete_options return ;; esac } _lttng_cmd_list() { - local list_opts - list_opts=$(lttng list --list-options) + options=$(lttng list --list-options) case $prev in --channel|-c) @@ -192,7 +197,7 @@ _lttng_cmd_list() { case $cur in -*) - COMPREPLY=( $(compgen -W "${list_opts}" -- $cur) ) + _lttng_complete_options return ;; *) @@ -202,12 +207,11 @@ _lttng_cmd_list() { } _lttng_cmd_setsession() { - local set_session_opts - set_session_opts=$(lttng set-session --list-options) + options=$(lttng set-session --list-options) case $cur in -*) - COMPREPLY=( $(compgen -W "${set_session_opts}" -- $cur) ) + _lttng_complete_options return ;; *) @@ -217,27 +221,51 @@ _lttng_cmd_setsession() { esac } +_lttng_cmd_snapshot() { + options=$(lttng snapshot --list-options) + commands=$(lttng snapshot --list-commands) + + _lttng_find_command $((command_found_index + 1)) + + if _lttng_cursor_is_after_command; then + case $prev in + --session|-s) + _lttng_complete_sessions + return + ;; + esac + + case $cur in + -*) + _lttng_complete_options + ;; + esac + else + _lttng_complete_commands + fi +} + _lttng_cmd_start() { - local start_opts - start_opts=$(lttng start --list-options) + options=$(lttng start --list-options) case $cur in -*) - COMPREPLY=( $(compgen -W "${start_opts}" -- $cur) ) + _lttng_complete_options + return ;; *) _lttng_complete_sessions + return ;; esac } _lttng_cmd_stop() { - local stop_opts - stop_opts=$(lttng stop --list-options) + options=$(lttng stop --list-options) case $cur in -*) - COMPREPLY=( $(compgen -W "${stop_opts}" -- $cur) ) + _lttng_complete_options ;; *) _lttng_complete_sessions @@ -246,37 +274,26 @@ _lttng_cmd_stop() { } _lttng_cmd_version() { - local version_opts - version_opts=$(lttng version --list-options) + options=$(lttng version --list-options) case $cur in -*) - COMPREPLY=( $(compgen -W "${version_opts}" -- $cur) ) + _lttng_complete_options ;; esac } _lttng_cmd_view() { - local view_opts - view_opts=$(lttng view --list-options) + options=$(lttng view --list-options) - case $cur in - -*) - COMPREPLY=( $(compgen -W "${view_opts}" -- $cur) ) + case $cur in + -*) + _lttng_complete_options ;; esac } -_lttng_opts() { - local opts - opts=$(lttng --list-options) - COMPREPLY=( $(compgen -W "${opts}" -- $cur) ) -} - -_lttng_commands() { - COMPREPLY=( $(compgen -W "$commands" -- $cur) ) -} _lttng_before_command() { # Check if the previous word should alter the behavior @@ -294,11 +311,11 @@ _lttng_before_command() { case $cur in -*) # If the current word starts with a dash, complete with options - _lttng_opts + _lttng_complete_options ;; *) # Otherwise complete with commands - _lttng_commands + _lttng_complete_commands ;; esac } @@ -306,11 +323,13 @@ _lttng_before_command() { _lttng_after_command() { local cmd_name - cmd_name=_lttng_cmd_${command//-/} + cmd_name=_lttng_cmd_${command_found//-/} type -t $cmd_name | grep -q 'function' && $cmd_name } +# Check if the word passed as the first parameter corresponds to a +# command. $command must be set to the list of possible commands. _lttng_is_command() { for command in $commands; do if [ "$1" == "$command" ]; then @@ -321,14 +340,18 @@ _lttng_is_command() { return 1 } -_lttng() { - local cur prev commands command_found command_found_index - - # Get the current and previous word - _get_comp_words_by_ref cur prev - - # Get the valid LTTng commands - commands=$(lttng --list-commands) +# Try to find a command in the current command line. Possible commands +# are passed in $commands. +# +# This function takes an optional parameter that indicates the index +# where to start the search in COMP_WORDS. If omitted, it defaults to 1. +# +# If a command is found, $command_found is filled with the name of the +# command and $command_found_index is set to the index of the command in +# $COMP_WORDS. If no command is found, $command_found is an empty string +# and $command_found_index is set to -1. +_lttng_find_command() { + start=${1:-1} # The text of the found command command_found="" @@ -336,18 +359,34 @@ _lttng() { # The index of the found command in COMP_WORDS command_found_index=-1 - for (( i = 1 ; i < ${#COMP_WORDS[@]} ; i++ )); do + for (( i = start ; i < ${#COMP_WORDS[@]} ; i++ )); do _lttng_is_command ${COMP_WORDS[$i]} if [ $? -eq 0 ]; then command_found=${COMP_WORDS[$i]} command_found_index=$i break fi - done +} + +_lttng_cursor_is_after_command() { + [ -n "$command_found" ] && [ "$COMP_CWORD" -gt "$command_found_index" ] +} + +_lttng() { + local cur prev commands command_found command_found_index + + # Get the current and previous word + _get_comp_words_by_ref cur prev + + # Get the valid first-level LTTng commands and options + commands=$(lttng --list-commands) + options=$(lttng --list-options) + + _lttng_find_command # Check if the cursor is before or after the command keyword - if [ -n "$command_found" ] && [ "$COMP_CWORD" -gt "$command_found_index" ]; then + if _lttng_cursor_is_after_command; then _lttng_after_command else _lttng_before_command