summaryrefslogtreecommitdiffstats
path: root/src/bash_completion/rbd
diff options
context:
space:
mode:
Diffstat (limited to 'src/bash_completion/rbd')
-rw-r--r--src/bash_completion/rbd83
1 files changed, 83 insertions, 0 deletions
diff --git a/src/bash_completion/rbd b/src/bash_completion/rbd
new file mode 100644
index 00000000..bef1670e
--- /dev/null
+++ b/src/bash_completion/rbd
@@ -0,0 +1,83 @@
+#
+# Ceph - scalable distributed file system
+#
+# Copyright (C) 2011 Wido den Hollander <wido@widodh.nl>
+#
+# This is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License version 2.1, as published by the Free Software
+# Foundation. See file COPYING.
+#
+_rbd_commands="" # lazy init
+_rbd_global_options="" # lazy init
+
+_rbd()
+{
+ if [ "x${_rbd_commands}" == "x" ]; then
+ local rbc="$(rbd bash-completion 2>/dev/null)"
+ _rbd_commands="$(echo ${rbc} | sed -e 's/|-[^|]*//g' -e 's/||*/|/g')"
+ _rbd_global_options="$(echo ${rbc} | sed -e 's/|[^-][^\|]*//g' -e 's/||*/|/g')"
+ fi
+
+ COMPREPLY=()
+
+ local arg_count=${#COMP_WORDS[@]}
+ local args=()
+ local help_request="false"
+ for (( i=1; i<arg_count; i++ )); do
+ word="${COMP_WORDS[i]}"
+ if [[ "x${word}" == "xhelp" && ${#args} == 0 ]]; then
+ # treat help request as a special case
+ help_request="true"
+ continue
+ elif [[ $(echo ${_rbd_global_options} | grep "|${word}|") ]]; then
+ # skip flag option
+ continue
+ elif [[ "x${word:0:1}" == "x-" ]]; then
+ # skip option with argument
+ let i=$i+1
+ continue
+ elif [[ "x${word}" == "x" ]]; then
+ # skip blank arguments
+ continue
+ fi
+
+ args+=("${word}")
+ done
+
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ local prev="${COMP_WORDS[COMP_CWORD-1]}"
+
+ local options_exp=${_rbd_global_options}
+ local command="${args[@]}"
+ local valid_command="false"
+ if [[ ${#args} != 0 && "${args[-1]}" != "${cur}" &&
+ $(echo "${_rbd_commands}" | grep -c "|${command}|") == 1 ]]; then
+ # combine global and command-specific options
+ local rbd_command_options="$(rbd bash-completion ${args[@]} 2>/dev/null)"
+ options_exp="${options_exp} ${rbd_command_options}"
+ valid_command="true"
+ fi
+
+ if [[ "x${cur}" == "xhelp" ]]; then
+ COMPREPLY=()
+ elif [[ "${options_exp}}" =~ "|${prev} path|" ]]; then
+ # perform path completion for path argument
+ COMPREPLY=($(compgen -f ${cur}))
+ elif [[ "${options_exp}}" =~ "|${prev} host|" ]]; then
+ # perform host completion for host argument
+ COMPREPLY=($(compgen -A hostname ${cur}))
+ elif [[ "${help_request}" == "false" && ( "x${cur:0:1}" == "x-" ||
+ ( "x${cur}" == "x" && "${valid_command}" == "true" ) ) ]]; then
+ # all valid options for current command
+ options="$(echo ${options_exp} | sed -e 's/||*/ /g' -r -e 's/ (arg|path|host)//g')"
+ COMPREPLY=($(compgen -W "${options}" -- ${cur}))
+ elif [[ "${valid_command}" == "false" ]]; then
+ # search for valid command
+ [[ "x${command}" != "x" && "x${cur}" == "x" ]] && command="${command} "
+ COMPREPLY=($(echo ${_rbd_commands} | grep -o "|${command}[^ |]*" | \
+ uniq | sed -e 's/|//g' | awk -F' ' '{print $(NF)}'))
+ fi
+}
+
+complete -F _rbd rbd