aboutsummaryrefslogtreecommitdiff
path: root/bash-completion
diff options
context:
space:
mode:
authorWilliam Hubbs <w.d.hubbs@gmail.com>2017-12-06 13:21:25 -0600
committerWilliam Hubbs <w.d.hubbs@gmail.com>2017-12-06 13:25:26 -0600
commitd220fc272337b216bff6ac781a7b6be4e6f3caee (patch)
treecd1411ccf2569faa87d64d8cdedfde2130aa0f9a /bash-completion
parenta2447dfb420cbd97a65cc085404c031d42cb3dfb (diff)
add bash completion support
This fixes #188.
Diffstat (limited to 'bash-completion')
-rw-r--r--bash-completion/Makefile11
-rw-r--r--bash-completion/openrc24
-rw-r--r--bash-completion/openrc-service-script29
-rw-r--r--bash-completion/rc-service113
-rw-r--r--bash-completion/rc-status31
-rw-r--r--bash-completion/rc-update42
6 files changed, 250 insertions, 0 deletions
diff --git a/bash-completion/Makefile b/bash-completion/Makefile
new file mode 100644
index 00000000..3d9d886a
--- /dev/null
+++ b/bash-completion/Makefile
@@ -0,0 +1,11 @@
+DIR= ${BASHCOMPDIR}
+CONF= openrc \
+ openrc-service-script \
+ rc-service \
+ rc-status \
+ rc-update \
+
+MK= ../mk
+include ${MK}/os.mk
+
+include ${MK}/scripts.mk
diff --git a/bash-completion/openrc b/bash-completion/openrc
new file mode 100644
index 00000000..e2718e0b
--- /dev/null
+++ b/bash-completion/openrc
@@ -0,0 +1,24 @@
+# Copyright (c) 2017 The OpenRC Authors.
+# See the Authors file at the top-level directory of this distribution and
+# https://github.com/OpenRC/openrc/blob/master/AUTHORS
+#
+# This file is part of OpenRC. It is subject to the license terms in
+# the LICENSE file found in the top-level directory of this
+# distribution and at https://github.com/OpenRC/openrc/blob/master/LICENSE
+# This file may not be copied, modified, propagated, or distributed
+# except according to the terms contained in the LICENSE file.
+
+#
+# openrc completion command
+#
+_openrc()
+{
+ local cur
+ COMPREPLY=()
+ cur="${COMP_WORDS[COMP_CWORD]}"
+ if [[ ${#COMP_WORDS[*]} -le 2 ]]; then
+ COMPREPLY=($(compgen -W "$(rc-status --list)" -- $cur))
+ fi
+ return 0
+} &&
+complete -F _openrc openrc
diff --git a/bash-completion/openrc-service-script b/bash-completion/openrc-service-script
new file mode 100644
index 00000000..455ad05f
--- /dev/null
+++ b/bash-completion/openrc-service-script
@@ -0,0 +1,29 @@
+# Copyright (c) 2017 The OpenRC Authors.
+# See the Authors file at the top-level directory of this distribution and
+# https://github.com/OpenRC/openrc/blob/master/AUTHORS
+#
+# This file is part of OpenRC. It is subject to the license terms in
+# the LICENSE file found in the top-level directory of this
+# distribution and at https://github.com/OpenRC/openrc/blob/master/LICENSE
+# This file may not be copied, modified, propagated, or distributed
+# except according to the terms contained in the LICENSE file.
+
+_openrc_service_script()
+{
+ local script="${COMP_WORDS[0]}"
+ local cur="${COMP_WORDS[$COMP_CWORD]}"
+
+ if [[ ( -f "${script}" || -h "${script}" ) && -r "${script}" ]] \
+ && [[ "$(head -n 1 "${script}")" =~ \#\!.*/openrc-run ]]
+ then
+ [[ $COMP_CWORD -gt 1 ]] && return 1
+ COMPREPLY=($(opts="start stop status restart pause zap ineed needsme iuse usesme broken"; \
+ eval "$(grep '^opts=' "${script}")"; echo "${opts}"))
+ [[ -n "$COMPREPLY" ]] || COMPREPLY=(start stop restart zap)
+ COMPREPLY=($(compgen -W "${COMPREPLY[*]}" -- "${cur}"))
+ else
+ COMPREPLY=($(compgen -o default -- "${cur}"))
+ fi
+ return 0
+}
+complete -F _openrc_service_script */etc/init.d/*
diff --git a/bash-completion/rc-service b/bash-completion/rc-service
new file mode 100644
index 00000000..b4e7709f
--- /dev/null
+++ b/bash-completion/rc-service
@@ -0,0 +1,113 @@
+# Copyright (c) 2017 The OpenRC Authors.
+# See the Authors file at the top-level directory of this distribution and
+# https://github.com/OpenRC/openrc/blob/master/AUTHORS
+#
+# This file is part of OpenRC. It is subject to the license terms in
+# the LICENSE file found in the top-level directory of this
+# distribution and at https://github.com/OpenRC/openrc/blob/master/LICENSE
+# This file may not be copied, modified, propagated, or distributed
+# except according to the terms contained in the LICENSE file.
+
+#
+# rc-service completion command
+#
+_rc_service()
+{
+ local cur prev numwords opts
+ local words i x filename
+ local action actionpos
+ COMPREPLY=()
+ cur="${COMP_WORDS[COMP_CWORD]}"
+ prev="${COMP_WORDS[COMP_CWORD-1]}"
+ numwords=${#COMP_WORDS[*]}
+
+ if [[ ${prev} == '>' || ${prev} == '<' ]] ; then
+ COMPREPLY=($(compgen -f -- ${cur}))
+ return 0
+ fi
+
+ # find action
+ for x in ${COMP_LINE} ; do
+ if [[ ${x} =~ --(list|exists|resolve) ]] || [[ ${x} =~ -(l|e|r) ]]
+ then
+ action=${x}
+ break
+ fi
+ done
+ if [[ -n ${action} ]]; then
+ for ((i = 0; i < ${numwords}; i++ )); do
+ if [[ ${COMP_WORDS[${i}]} == "${action}" ]]; then
+ actionpos=${i}
+ break
+ fi
+ done
+
+ for ((i = 1; i < ${numwords}; i++ )); do
+ if [[ ! ${COMP_WORDS[$i]} == -* ]]; then
+ break
+ fi
+ done
+ fi
+
+ if [[ ${COMP_CWORD} -eq 3 ]]; then
+ return 1
+ fi
+
+ # check if an option was typed
+ if [[ ${cur} == -* ]]; then
+ if [[ ${cur} == --* ]]; then
+ opts="--list --exists --resolve"
+ COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
+ return 0
+ elif [[ ${cur} == -* ]]; then
+ opts="-l -e -r"
+ COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
+ return 0
+ fi
+
+ # NOTE: This slows things down!
+ # (Adapted from bash_completion by Ian Macdonald <ian@caliban.org>)
+ # This removes any options from the list of completions that have
+ # already been specified on the command line.
+ COMPREPLY=($(echo "${COMP_WORDS[@]}" | \
+ (while read -d ' ' i; do
+ [[ -z ${i} ]] && continue
+ # flatten array with spaces on either side,
+ # otherwise we cannot grep on word boundaries of
+ # first and last word
+ COMPREPLY=" ${COMPREPLY[@]} "
+ # remove word from list of completions
+ COMPREPLY=(${COMPREPLY/ ${i%% *} / })
+ done
+ echo ${COMPREPLY[@]})))
+
+ return 0
+ else
+ # no option was typed
+ if [[ ${COMP_CWORD} -eq 1 ]]; then # if first word typed
+ words="$(rc-service --list | grep ^${cur})" # complete for init scripts
+ COMPREPLY=($(for i in ${words} ; do \
+ [[ ${i} == ${cur}* ]] && echo ${i} ; \
+ done))
+ return 0
+ elif [[ ${COMP_CWORD} -eq 2 ]] && [[ ${prev} != -* ]]; then # if second word typed and we didn't type in a function
+ filename=$(rc-service --resolve ${prev})
+ opts=$(cat ${filename} | grep "^\w*()" | sed "s/().*$//") # Greps the functions included in the init script
+ if [[ "x${opts}" == "x" ]] ; then # if no options found loosen the grep algorhythm
+ opts=$(cat ${filename} | grep "\w*()" | sed "s/().*$//")
+ fi
+ COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
+ return 0
+ fi
+ fi
+ if [[ ${action} == '--exists' ]] || [[ ${action} == '-e' ]] || \
+ [[ ${action} == '--resolve' ]] || [[ ${action} == '-r' ]]; then
+ words="$(rc-service --list | grep ^${cur})"
+ COMPREPLY=($(for i in ${words} ; do \
+ [[ ${i} == ${cur}* ]] && echo ${i} ; \
+ done))
+ return 0
+ fi
+ return 0
+} &&
+complete -F _rc_service rc-service
diff --git a/bash-completion/rc-status b/bash-completion/rc-status
new file mode 100644
index 00000000..d75ed148
--- /dev/null
+++ b/bash-completion/rc-status
@@ -0,0 +1,31 @@
+# Copyright (c) 2017 The OpenRC Authors.
+# See the Authors file at the top-level directory of this distribution and
+# https://github.com/OpenRC/openrc/blob/master/AUTHORS
+#
+# This file is part of OpenRC. It is subject to the license terms in
+# the LICENSE file found in the top-level directory of this
+# distribution and at https://github.com/OpenRC/openrc/blob/master/LICENSE
+# This file may not be copied, modified, propagated, or distributed
+# except according to the terms contained in the LICENSE file.
+
+#
+# rc-status completion command
+#
+_rcstatus()
+{
+ local cur
+ cur="${COMP_WORDS[COMP_CWORD]}"
+ if [[ $COMP_CWORD -eq 1 ]]; then
+ if [[ "${cur}" == --* ]]; then
+ COMPREPLY=($(compgen -W '--all --list --unused' -- ${cur}))
+ elif [[ "${cur}" == -* ]]; then
+ COMPREPLY=($(compgen -W '-a -l -u' -- ${cur}))
+ else
+ COMPREPLY=($(compgen -W "$(rc-status --list)" -- ${cur}))
+ fi
+ else
+ unset COMPREPLY
+ fi
+ return 0
+} &&
+complete -F _rcstatus rc-status
diff --git a/bash-completion/rc-update b/bash-completion/rc-update
new file mode 100644
index 00000000..7fd310df
--- /dev/null
+++ b/bash-completion/rc-update
@@ -0,0 +1,42 @@
+# Copyright (c) 2017 The OpenRC Authors.
+# See the Authors file at the top-level directory of this distribution and
+# https://github.com/OpenRC/openrc/blob/master/AUTHORS
+#
+# This file is part of OpenRC. It is subject to the license terms in
+# the LICENSE file found in the top-level directory of this
+# distribution and at https://github.com/OpenRC/openrc/blob/master/LICENSE
+# This file may not be copied, modified, propagated, or distributed
+# except according to the terms contained in the LICENSE file.
+
+#
+# rc-update completion command
+#
+_rc_update()
+{
+ local cur show
+ COMPREPLY=()
+ cur="${COMP_WORDS[COMP_CWORD]}"
+ if [[ $COMP_CWORD -eq 1 ]]; then
+ if [[ "${cur}" == -* ]]; then
+ COMPREPLY=($(compgen -W '-a -d -s' -- ${cur}))
+ else
+ COMPREPLY=($(compgen -W 'add del show' ${cur}))
+ fi
+ else
+ if [[ "${COMP_WORDS[1]}" == "show" ]] || [[ "${COMP_WORDS[1]}" == "-s" ]]; then
+ show="TRUE"
+ fi
+ if ([[ $COMP_CWORD -eq 3 ]] && [[ -z "$show" ]]) || \
+ ([[ $COMP_CWORD -eq 2 ]] && [[ -n "$show" ]]); then
+ COMPREPLY=($(compgen -W "$(rc-status --list)" -- $cur))
+ elif [[ $COMP_CWORD -eq 2 ]]; then
+ COMPREPLY=($(compgen -W "$(rc-service --list)" $cur))
+ elif [[ ${#COMP_WORDS[*]} -gt 2 ]] ; then
+ COMPREPLY=($(compgen -W "$(rc-status --list)" -- $cur))
+ else
+ unset COMPREPLY
+ fi
+ fi
+ return 0
+} &&
+complete -F _rc_update rc-update