misc/ccm-completion.bash (47 lines of code) (raw):
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##############################################################################
# ccm-completion.bash
#
# CCM command completion logic for bash. It dynamically determines available
# sub-commands based on the ccm being invoked. Thus, users running multiple
# ccm's (or a ccm that they are continuously updating with new commands) will
# automagically work.
#
# This completion script relies on ccm having two hidden subcommands:
# show-cluster-cmds - emits the names of cluster sub-commands.
# show-node-cmds - emits the names of node sub-commands.
#
# Usage:
# * Copy the script into your home directory or some such.
# * Source it from your ~/.bash_profile: . ~/scripts/ccm-completion.bash
##############################################################################
case "$COMP_WORDBREAKS" in
*:*) : great ;;
*) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
esac
__ccmcomp_is_node ()
{
local CANDIDATE=$1
# Get the list of nodes from 'ccm list' and then see if the given node
# name is in it.
local RC=1
for i in $(__ccmcomp_node_list) ; do
if [ "$CANDIDATE" == "$i" ] ; then
RC=0
break
fi
done
return $RC
}
__ccmcomp_node_list ()
{
${COMP_WORDS[0]} status | grep -E ': (DOWN|UP)' | sed -e 's/:.*//'
}
__ccm_switch ()
{
local CMD=${COMP_WORDS[0]}
local WORD=$1
COMPREPLY=( $(compgen -W "$($CMD list | sed -E -e 's/ *\*?//')" $WORD) )
}
__ccmcomp_cluster_cmd_filter ()
{
local CMD=${COMP_WORDS[0]}
local WORD=$2
local PREV_WORD=$3
# Is this the first arg to ccm? If so, we want cluster commands.
if [ $COMP_CWORD == 1 ] ; then
# We get the cluster-cmds via a background process to make this go a
# bit faster. 10s-100s of milliseconds make a difference here because
# a user is waiting on the completion response.
exec 3< <($CMD show-cluster-cmds)
COMPREPLY=( $(compgen -W "$(__ccmcomp_node_list) $(cat <&3)" $WORD) )
else
# PREV_WORD is a sub-command or node name. If it's a node name,
# show (filtered) node commands.
if __ccmcomp_is_node $PREV_WORD ; then
COMPREPLY=( $(compgen -W "$($CMD show-node-cmds)" $WORD) )
else
# It's a subcommand. Call the argument filter function for that
# sub-command if it exists
if type __ccm_$PREV_WORD > /dev/null 2>&1 ; then
__ccm_$PREV_WORD $WORD
else
return 1
fi
fi
fi
}
# Bind completions for ccm to invoke our top-level handling function.
complete -F __ccmcomp_cluster_cmd_filter ccm