[systemd-devel] [PATCH 1/2] systemd-helpers
Carlos Morata Castillo
cmc809 at inlumine.ual.es
Sat Jan 10 04:33:05 PST 2015
Hi,
As stated here, we should use a library for bash autocompletions (maybe even with include guards).
http://cgit.freedesktop.org/systemd/systemd/commit/shell-completion/bash/localectl?id=a72d698d0d9ff9c158155b44cdc77376df31a317
Explanation:
Using autotools make the autocompletions to /usr/share/bash-completions/completions (as the exit from pkg-config --variable=completionsdir
bash-completion).
We ended up having multiple function definitions and even messing around with the global bash function namespace, as the functions are called
__get_something being possible to redefine other binary bash function.
With this patch:
1- All the files in bash completions, except busctl and systemctl.in, use this common library.
2- They are prefixed with the namespace __systemdh.
---
shell-completion/bash/bootctl | 12 ++---
shell-completion/bash/coredumpctl | 21 ++++----
shell-completion/bash/hostnamectl | 14 ++----
shell-completion/bash/journalctl | 10 ++--
shell-completion/bash/localectl | 18 +++----
shell-completion/bash/loginctl | 36 ++++++--------
shell-completion/bash/machinectl | 26 ++++------
shell-completion/bash/systemd-analyze | 31 ++++--------
shell-completion/bash/systemd-cat | 10 ++--
shell-completion/bash/systemd-cgls | 17 ++-----
shell-completion/bash/systemd-cgtop | 8 +--
shell-completion/bash/systemd-delta | 10 ++--
shell-completion/bash/systemd-detect-virt | 8 +--
shell-completion/bash/systemd-helpers | 83 +++++++++++++++++++++++++++++++
shell-completion/bash/systemd-nspawn | 43 +++-------------
shell-completion/bash/systemd-run | 60 ++++++++++------------
shell-completion/bash/timedatectl | 18 +++----
shell-completion/bash/udevadm | 20 +++-----
Makefile.am | 1 +
19 files changed, 206 insertions(+), 240 deletions(-)
create mode 100644 shell-completion/bash/systemd-helpers
diff --git a/shell-completion/bash/bootctl b/shell-completion/bash/bootctl
index c86ec7e..be627b2 100644
--- a/shell-completion/bash/bootctl
+++ b/shell-completion/bash/bootctl
@@ -17,12 +17,8 @@
# You should have received a copy of the GNU Lesser General Public License
# along with systemd; If not, see <http://www.gnu.org/licenses/>.
-__contains_word () {
- local w word=$1; shift
- for w in "$@"; do
- [[ $w = "$word" ]] && return
- done
-}
+#Common functions
+. ./systemd-helpers
_bootctl() {
local i verb comps
@@ -41,7 +37,7 @@ _bootctl() {
)
for ((i=0; i < COMP_CWORD; i++)); do
- if __contains_word "${COMP_WORDS[i]}" ${VERBS[*]}; then
+ if __systemdh_contains_word "${COMP_WORDS[i]}" ${VERBS[*]}; then
verb=${COMP_WORDS[i]}
break
fi
@@ -49,7 +45,7 @@ _bootctl() {
if [[ -z $verb ]]; then
comps=${VERBS[*]}
- elif __contains_word "$verb" ${VERBS[STANDALONE]}; then
+ elif __systemdh_contains_word "$verb" ${VERBS[STANDALONE]}; then
comps=''
fi
diff --git a/shell-completion/bash/coredumpctl b/shell-completion/bash/coredumpctl
index e23152d..0c4cda3 100644
--- a/shell-completion/bash/coredumpctl
+++ b/shell-completion/bash/coredumpctl
@@ -17,12 +17,8 @@
# You should have received a copy of the GNU Lesser General Public License
# along with systemd; If not, see <http://www.gnu.org/licenses/>.
-__contains_word () {
- local w word=$1; shift
- for w in "$@"; do
- [[ $w = "$word" ]] && return
- done
-}
+#Common functions
+. ./systemd-helpers
__journal_fields=(MESSAGE{,_ID} PRIORITY CODE_{FILE,LINE,FUNC}
ERRNO SYSLOG_{FACILITY,IDENTIFIER,PID} COREDUMP_EXE
@@ -34,6 +30,7 @@ __journal_fields=(MESSAGE{,_ID} PRIORITY CODE_{FILE,LINE,FUNC}
_KERNEL_{DEVICE,SUBSYSTEM}
_UDEV_{SYSNAME,DEVNODE,DEVLINK}
__CURSOR __{REALTIME,MONOTONIC}_TIMESTAMP)
+
_coredumpctl() {
local i verb comps
local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
@@ -44,15 +41,15 @@ _coredumpctl() {
[DUMP]='dump gdb'
)
- if __contains_word "$prev" '--output -o'; then
+ if __systemdh_contains_word "$prev" '--output -o'; then
comps=$( compgen -A file -- "$cur" )
compopt -o filenames
- elif __contains_word "$prev" '--FIELD -F'; then
+ elif __systemdh_contains_word "$prev" '--FIELD -F'; then
comps=$( compgen -W '${__journal_fields[*]}' -- "$cur" )
elif [[ $cur = -* ]]; then
comps=${OPTS}
- elif __contains_word "$prev" ${VERBS[*]} &&
- ! __contains_word ${COMP_WORDS[COMP_CWORD-2]} '--output -o -F --field'; then
+ elif __systemdh_contains_word "$prev" ${VERBS[*]} &&
+ ! __systemdh_contains_word ${COMP_WORDS[COMP_CWORD-2]} '--output -o -F --field'; then
compopt -o nospace
COMPREPLY=( $(compgen -W '${__journal_fields[*]}' -S= -- "$cur") )
return 0
@@ -65,7 +62,7 @@ _coredumpctl() {
comps=${field_vals[*]}
else
for ((i=0; i <= COMP_CWORD; i++)); do
- if __contains_word "${COMP_WORDS[i]}" ${VERBS[*]}; then
+ if __systemdh_contains_word "${COMP_WORDS[i]}" ${VERBS[*]}; then
verb=${COMP_WORDS[i]}
break
fi
@@ -73,7 +70,7 @@ _coredumpctl() {
if [[ -z $verb ]]; then
comps=${VERBS[*]}
- elif __contains_word "$verb" ${VERBS[LIST]} ${VERBS[DUMP]}; then
+ elif __systemdh_contains_word "$verb" ${VERBS[LIST]} ${VERBS[DUMP]}; then
comps=''
fi
fi
diff --git a/shell-completion/bash/hostnamectl b/shell-completion/bash/hostnamectl
index 7a0850d..a74931f 100644
--- a/shell-completion/bash/hostnamectl
+++ b/shell-completion/bash/hostnamectl
@@ -17,12 +17,8 @@
# You should have received a copy of the GNU Lesser General Public License
# along with systemd; If not, see <http://www.gnu.org/licenses/>.
-__contains_word () {
- local w word=$1; shift
- for w in "$@"; do
- [[ $w = "$word" ]] && return
- done
-}
+#Common functions
+. ./systemd-helpers
_hostnamectl() {
local i verb comps
@@ -43,7 +39,7 @@ _hostnamectl() {
)
for ((i=0; i < COMP_CWORD; i++)); do
- if __contains_word "${COMP_WORDS[i]}" ${VERBS[*]}; then
+ if __systemdh_contains_word "${COMP_WORDS[i]}" ${VERBS[*]}; then
verb=${COMP_WORDS[i]}
break
fi
@@ -51,9 +47,9 @@ _hostnamectl() {
if [[ -z $verb ]]; then
comps=${VERBS[*]}
- elif __contains_word "$verb" ${VERBS[CHASSIS]}; then
+ elif __systemdh_contains_word "$verb" ${VERBS[CHASSIS]}; then
comps='desktop laptop server tablet handset watch embedded vm container'
- elif __contains_word "$verb" ${VERBS[STANDALONE]} ${VERBS[ICONS]} ${VERBS[NAME]}; then
+ elif __systemdh_contains_word "$verb" ${VERBS[STANDALONE]} ${VERBS[ICONS]} ${VERBS[NAME]}; then
comps=''
fi
diff --git a/shell-completion/bash/journalctl b/shell-completion/bash/journalctl
index 2efa100..d66fa1a 100644
--- a/shell-completion/bash/journalctl
+++ b/shell-completion/bash/journalctl
@@ -17,12 +17,8 @@
# You should have received a copy of the GNU Lesser General Public License
# along with systemd; If not, see <http://www.gnu.org/licenses/>.
-__contains_word () {
- local w word=$1; shift
- for w in "$@"; do
- [[ $w = "$word" ]] && return
- done
-}
+#Common functions
+. ./systemd-helpers
__journal_fields=(MESSAGE{,_ID} PRIORITY CODE_{FILE,LINE,FUNC}
ERRNO SYSLOG_{FACILITY,IDENTIFIER,PID} COREDUMP_EXE
@@ -51,7 +47,7 @@ _journalctl() {
--verify-key'
)
- if __contains_word "$prev" ${OPTS[ARG]} ${OPTS[ARGUNKNOWN]}; then
+ if __systemdh_contains_word "$prev" ${OPTS[ARG]} ${OPTS[ARGUNKNOWN]}; then
case $prev in
--boot|--this-boot|-b)
comps=$(journalctl -F '_BOOT_ID' 2>/dev/null)
diff --git a/shell-completion/bash/localectl b/shell-completion/bash/localectl
index c9e22af..647ff89 100644
--- a/shell-completion/bash/localectl
+++ b/shell-completion/bash/localectl
@@ -17,12 +17,8 @@
# You should have received a copy of the GNU Lesser General Public License
# along with systemd; If not, see <http://www.gnu.org/licenses/>.
-__contains_word () {
- local w word=$1; shift
- for w in "$@"; do
- [[ $w = "$word" ]] && return
- done
-}
+#Common functions
+. ./systemd-helpers
__locale_fields=( LANG LANGUAGE LC_CTYPE LC_NUMERIC LC_TIME \
LC_COLLATE LC_MONETARY LC_MESSAGES LC_PAPER \
@@ -36,7 +32,7 @@ _localectl() {
local OPTS='-h --help --version --no-convert --no-pager --no-ask-password
-H --host'
- if __contains_word "$prev" $OPTS; then
+ if __systemdh_contains_word "$prev" $OPTS; then
case $prev in
--host|-H)
comps=''
@@ -59,7 +55,7 @@ _localectl() {
)
for ((i=0; i < COMP_CWORD; i++)); do
- if __contains_word "${COMP_WORDS[i]}" ${VERBS[*]}; then
+ if __systemdh_contains_word "${COMP_WORDS[i]}" ${VERBS[*]}; then
verb=${COMP_WORDS[i]}
break
fi
@@ -67,7 +63,7 @@ _localectl() {
if [[ -z $verb ]]; then
comps=${VERBS[*]}
- elif __contains_word "$verb" ${VERBS[LOCALES]}; then
+ elif __systemdh_contains_word "$verb" ${VERBS[LOCALES]}; then
if [[ $cur = *=* ]]; then
mapfile -t locale_vals < <(command localectl list-locales 2>/dev/null)
COMPREPLY=( $(compgen -W '${locale_vals[*]}' -- "${cur#=}") )
@@ -79,9 +75,9 @@ _localectl() {
COMPREPLY=( $(compgen -W '${__locale_fields[*]}' -S= -- "$cur") )
fi
return 0
- elif __contains_word "$verb" ${VERBS[KEYMAPS]}; then
+ elif __systemdh_contains_word "$verb" ${VERBS[KEYMAPS]}; then
comps=$(command localectl list-keymaps)
- elif __contains_word "$verb" ${VERBS[STANDALONE]} ${VERBS[X11]}; then
+ elif __systemdh_contains_word "$verb" ${VERBS[STANDALONE]} ${VERBS[X11]}; then
comps=''
fi
diff --git a/shell-completion/bash/loginctl b/shell-completion/bash/loginctl
index e7adb93..5b1aa47 100644
--- a/shell-completion/bash/loginctl
+++ b/shell-completion/bash/loginctl
@@ -17,16 +17,8 @@
# You should have received a copy of the GNU Lesser General Public License
# along with systemd; If not, see <http://www.gnu.org/licenses/>.
-__contains_word () {
- local w word=$1; shift
- for w in "$@"; do
- [[ $w = "$word" ]] && return
- done
-}
-
-__get_all_sessions () { loginctl --no-legend list-sessions | { while read -r a b; do printf "%s\n" "$a"; done; } ; }
-__get_all_users () { loginctl --no-legend list-users | { while read -r a b; do printf "%s\n" "$b"; done; } ; }
-__get_all_seats () { loginctl --no-legend list-seats | { while read -r a b; do printf "%s\n" "$a"; done; } ; }
+#Common functions
+. ./systemd-helpers
_loginctl () {
local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
@@ -37,7 +29,7 @@ _loginctl () {
[ARG]='--host -H --kill-who --property -p --signal -s'
)
- if __contains_word "$prev" ${OPTS[ARG]}; then
+ if __systemdh_contains_word "$prev" ${OPTS[ARG]}; then
case $prev in
--signal|-s)
comps=$(compgen -A signal)
@@ -71,8 +63,8 @@ _loginctl () {
)
for ((i=0; i < COMP_CWORD; i++)); do
- if __contains_word "${COMP_WORDS[i]}" ${VERBS[*]} &&
- ! __contains_word "${COMP_WORDS[i-1]}" ${OPTS[ARG]}; then
+ if __systemdh_contains_word "${COMP_WORDS[i]}" ${VERBS[*]} &&
+ ! __systemdh_contains_word "${COMP_WORDS[i-1]}" ${OPTS[ARG]}; then
verb=${COMP_WORDS[i]}
break
fi
@@ -81,21 +73,21 @@ _loginctl () {
if [[ -z $verb ]]; then
comps="${VERBS[*]}"
- elif __contains_word "$verb" ${VERBS[SESSIONS]}; then
- comps=$( __get_all_sessions )
+ elif __systemdh_contains_word "$verb" ${VERBS[SESSIONS]}; then
+ comps=$( __systemdh_get_sessions )
- elif __contains_word "$verb" ${VERBS[USERS]}; then
- comps=$( __get_all_users )
+ elif __systemdh_contains_word "$verb" ${VERBS[USERS]}; then
+ comps=$( __systemdh_get_users )
- elif __contains_word "$verb" ${VERBS[SEATS]}; then
- comps=$( __get_all_seats )
+ elif __systemdh_contains_word "$verb" ${VERBS[SEATS]}; then
+ comps=$( __systemdh_get_seats )
- elif __contains_word "$verb" ${VERBS[STANDALONE]}; then
+ elif __systemdh_contains_word "$verb" ${VERBS[STANDALONE]}; then
comps=''
- elif __contains_word "$verb" ${VERBS[ATTACH]}; then
+ elif __systemdh_contains_word "$verb" ${VERBS[ATTACH]}; then
if [[ $prev = $verb ]]; then
- comps=$( __get_all_seats )
+ comps=$( __systemdh_get_seats )
else
comps=$(compgen -A file -- "$cur" )
compopt -o filenames
diff --git a/shell-completion/bash/machinectl b/shell-completion/bash/machinectl
index 3789492..300761a 100644
--- a/shell-completion/bash/machinectl
+++ b/shell-completion/bash/machinectl
@@ -17,17 +17,9 @@
# You should have received a copy of the GNU Lesser General Public License
# along with systemd; If not, see <http://www.gnu.org/licenses/>.
-__contains_word() {
- local w word=$1; shift
- for w in "$@"; do
- [[ $w = "$word" ]] && return
- done
-}
+#Common functions
+. ./systemd-helpers
-__get_machines() {
- local a b
- machinectl list --no-legend --no-pager | { while read a b; do echo " $a"; done; };
-}
_machinectl() {
local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
@@ -46,14 +38,14 @@ _machinectl() {
_init_completion || return
for ((i=0; i <= COMP_CWORD; i++)); do
- if __contains_word "${COMP_WORDS[i]}" ${VERBS[*]} &&
- ! __contains_word "${COMP_WORDS[i-1]}" ${OPTS[ARG]}; then
+ if __systemdh_contains_word "${COMP_WORDS[i]}" ${VERBS[*]} &&
+ ! __systemdh_contains_word "${COMP_WORDS[i-1]}" ${OPTS[ARG]}; then
verb=${COMP_WORDS[i]}
break
fi
done
- if __contains_word "$prev" ${OPTS[ARG]}; then
+ if __systemdh_contains_word "$prev" ${OPTS[ARG]}; then
case $prev in
--signal|-s)
comps=$(compgen -A signal)
@@ -65,7 +57,7 @@ _machinectl() {
comps=$(compgen -A hostname)
;;
--machine|-M)
- comps=$( __get_machines )
+ comps=$( __systemdh_get_machines )
;;
--property|-p)
comps=''
@@ -83,11 +75,11 @@ _machinectl() {
if [[ -z $verb ]]; then
comps=${VERBS[*]}
- elif __contains_word "$verb" ${VERBS[STANDALONE]}; then
+ elif __systemdh_contains_word "$verb" ${VERBS[STANDALONE]}; then
comps=''
- elif __contains_word "$verb" ${VERBS[MACHINES]}; then
- comps=$( __get_machines )
+ elif __systemdh_contains_word "$verb" ${VERBS[MACHINES]}; then
+ comps=$( __systemdh_get_machines )
fi
COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
diff --git a/shell-completion/bash/systemd-analyze b/shell-completion/bash/systemd-analyze
index 77d1b54..b351a2f 100644
--- a/shell-completion/bash/systemd-analyze
+++ b/shell-completion/bash/systemd-analyze
@@ -18,17 +18,8 @@
# You should have received a copy of the GNU Lesser General Public License
# along with systemd; If not, see <http://www.gnu.org/licenses/>.
-__contains_word () {
- local w word=$1; shift
- for w in "$@"; do
- [[ $w = "$word" ]] && return
- done
-}
-
-__get_machines() {
- local a b
- machinectl list --no-legend --no-pager | { while read a b; do echo " $a"; done; };
-}
+#Common functions
+. ./systemd-helpers
_systemd_analyze() {
local i verb comps
@@ -50,20 +41,20 @@ _systemd_analyze() {
_init_completion || return
for ((i=0; i < COMP_CWORD; i++)); do
- if __contains_word "${COMP_WORDS[i]}" ${VERBS[*]} &&
- ! __contains_word "${COMP_WORDS[i-1]}" ${OPTS[ARG]}; then
+ if __systemdh_contains_word "${COMP_WORDS[i]}" ${VERBS[*]} &&
+ ! __systemdh_contains_word "${COMP_WORDS[i-1]}" ${OPTS[ARG]}; then
verb=${COMP_WORDS[i]}
break
fi
done
- if __contains_word "$prev" ${OPTS[ARG]}; then
+ if __systemdh_contains_word "$prev" ${OPTS[ARG]}; then
case $prev in
--host|-H)
comps=$(compgen -A hostname)
;;
--machine|-M)
- comps=$( __get_machines )
+ comps=$( __systemdh_get_machines )
;;
esac
COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
@@ -78,29 +69,29 @@ _systemd_analyze() {
if [[ -z $verb ]]; then
comps=${VERBS[*]}
- elif __contains_word "$verb" ${VERBS[STANDALONE]}; then
+ elif __systemdh_contains_word "$verb" ${VERBS[STANDALONE]}; then
if [[ $cur = -* ]]; then
comps='--help --version --system --user'
fi
- elif __contains_word "$verb" ${VERBS[CRITICAL_CHAIN]}; then
+ elif __systemdh_contains_word "$verb" ${VERBS[CRITICAL_CHAIN]}; then
if [[ $cur = -* ]]; then
comps='--help --version --system --user --fuzz'
fi
- elif __contains_word "$verb" ${VERBS[DOT]}; then
+ elif __systemdh_contains_word "$verb" ${VERBS[DOT]}; then
if [[ $cur = -* ]]; then
comps='--help --version --system --user --from-pattern --to-pattern --order --require'
fi
- elif __contains_word "$verb" ${VERBS[LOG_LEVEL]}; then
+ elif __systemdh_contains_word "$verb" ${VERBS[LOG_LEVEL]}; then
if [[ $cur = -* ]]; then
comps='--help --version --system --user'
else
comps='debug info notice warning err crit alert emerg'
fi
- elif __contains_word "$verb" ${VERBS[VERIFY]}; then
+ elif __systemdh_contains_word "$verb" ${VERBS[VERIFY]}; then
if [[ $cur = -* ]]; then
comps='--help --version --system --user --no-man'
else
diff --git a/shell-completion/bash/systemd-cat b/shell-completion/bash/systemd-cat
index 8d84042..e904f0c 100644
--- a/shell-completion/bash/systemd-cat
+++ b/shell-completion/bash/systemd-cat
@@ -17,12 +17,8 @@
# You should have received a copy of the GNU Lesser General Public License
# along with systemd; If not, see <http://www.gnu.org/licenses/>.
-__contains_word() {
- local w word=$1; shift
- for w in "$@"; do
- [[ $w = "$word" ]] && return
- done
-}
+#Common functions
+. ./systemd-helpers
_systemd_cat() {
local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
@@ -35,7 +31,7 @@ _systemd_cat() {
_init_completion || return
- if __contains_word "$prev" ${OPTS[ARG]}; then
+ if __systemdh_contains_word "$prev" ${OPTS[ARG]}; then
case $prev in
--identifier|-t)
comps=''
diff --git a/shell-completion/bash/systemd-cgls b/shell-completion/bash/systemd-cgls
index 0570438..91f2de3 100644
--- a/shell-completion/bash/systemd-cgls
+++ b/shell-completion/bash/systemd-cgls
@@ -17,17 +17,8 @@
# You should have received a copy of the GNU Lesser General Public License
# along with systemd; If not, see <http://www.gnu.org/licenses/>.
-__contains_word() {
- local w word=$1; shift
- for w in "$@"; do
- [[ $w = "$word" ]] && return
- done
-}
-
-__get_machines() {
- local a b
- machinectl list --no-legend --no-pager | { while read a b; do echo " $a"; done; };
-}
+#Common functions
+. ./systemd-helpers
_systemd_cgls() {
local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
@@ -40,10 +31,10 @@ _systemd_cgls() {
_init_completion || return
- if __contains_word "$prev" ${OPTS[ARG]}; then
+ if __systemdh_contains_word "$prev" ${OPTS[ARG]}; then
case $prev in
--machine|-M)
- comps=$( __get_machines )
+ comps=$( __systemdh_get_machines )
;;
esac
COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
diff --git a/shell-completion/bash/systemd-cgtop b/shell-completion/bash/systemd-cgtop
index d7ea42d..89e5619 100644
--- a/shell-completion/bash/systemd-cgtop
+++ b/shell-completion/bash/systemd-cgtop
@@ -17,12 +17,8 @@
# You should have received a copy of the GNU Lesser General Public License
# along with systemd; If not, see <http://www.gnu.org/licenses/>.
-__contains_word() {
- local w word=$1; shift
- for w in "$@"; do
- [[ $w = "$word" ]] && return
- done
-}
+#Common functions
+. ./systemd-helpers
_systemd_cgtop() {
local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
diff --git a/shell-completion/bash/systemd-delta b/shell-completion/bash/systemd-delta
index cb17328..ab305a6 100644
--- a/shell-completion/bash/systemd-delta
+++ b/shell-completion/bash/systemd-delta
@@ -17,12 +17,8 @@
# You should have received a copy of the GNU Lesser General Public License
# along with systemd; If not, see <http://www.gnu.org/licenses/>.
-__contains_word() {
- local w word=$1; shift
- for w in "$@"; do
- [[ $w = "$word" ]] && return
- done
-}
+#Common functions
+. ./systemd-helpers
_systemd-delta() {
local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
@@ -36,7 +32,7 @@ _systemd-delta() {
_init_completion || return
- if __contains_word "$prev" ${OPTS[ARG]}; then
+ if __systemdh_contains_word "$prev" ${OPTS[ARG]}; then
case $prev in
--diff)
comps='yes no'
diff --git a/shell-completion/bash/systemd-detect-virt b/shell-completion/bash/systemd-detect-virt
index df06c29..183b196 100644
--- a/shell-completion/bash/systemd-detect-virt
+++ b/shell-completion/bash/systemd-detect-virt
@@ -17,12 +17,8 @@
# You should have received a copy of the GNU Lesser General Public License
# along with systemd; If not, see <http://www.gnu.org/licenses/>.
-__contains_word() {
- local w word=$1; shift
- for w in "$@"; do
- [[ $w = "$word" ]] && return
- done
-}
+#Common functions
+. ./systemd-helpers
_systemd_detect_virt() {
local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
diff --git a/shell-completion/bash/systemd-helpers b/shell-completion/bash/systemd-helpers
new file mode 100644
index 0000000..51ee556
--- /dev/null
+++ b/shell-completion/bash/systemd-helpers
@@ -0,0 +1,83 @@
+# systemd-helpers completion -*- shell-script -*-
+#
+# This file is part of systemd.
+#
+# Copyright 2015 Carlos Morata Castillo cmc809 at inlumine.ual.es
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+#
+# systemd is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with systemd; If not, see <http://www.gnu.org/licenses/>.
+
+__systemdh_contains_word () {
+ local w word=$1; shift
+ for w in "$@"; do
+ [[ $w = "$word" ]] && return
+ done
+}
+
+__systemdh_get_users() {
+ local a b
+ loginctl list-users --no-legend --no-pager | while read a b;
+ do
+ echo " $b";
+ done
+}
+
+__systemdh_get_sessions () {
+ local a b
+ loginctl --no-legend list-sessions | while read -r a b;
+ do
+ printf "%s\n" "$a";
+ done
+}
+
+__systemdh_get_seats() {
+ local a b
+ loginctl --no-legend list-seats | while read -r a b;
+ do
+ printf "%s\n" "$a";
+ done
+}
+
+__systemdh_get_machines() {
+ local a b
+ machinectl list --no-legend --no-pager | while read a b;
+ do
+ echo " $a";
+ done
+}
+
+__systemdh_get_env() {
+ local a
+ env | while read a;
+ do
+ echo " ${a%%=*}";
+ done
+}
+
+__systemdh_get_interfaces(){
+ cut -f 1 -d ' ' /proc/net/dev | tail -n +3 | tr -s '\n' | tr -d ':' | xargs
+}
+
+__systemdh_get_slices() {
+ local a b
+ #add -all?
+ systemctl $1 list-units -t slice --no-legend --no-pager | while read a b;
+ do
+ echo " $a";
+ done
+}
+
+__systemdh_get_sysdevs() {
+ local -a devs=(/sys/bus/*/devices/*/ /sys/class/*/*/)
+ printf '%s\n' "${devs[@]%/}"
+}
diff --git a/shell-completion/bash/systemd-nspawn b/shell-completion/bash/systemd-nspawn
index 83e34ef..1f7ee2b 100644
--- a/shell-completion/bash/systemd-nspawn
+++ b/shell-completion/bash/systemd-nspawn
@@ -17,36 +17,9 @@
# You should have received a copy of the GNU Lesser General Public License
# along with systemd; If not, see <http://www.gnu.org/licenses/>.
-__contains_word() {
- local w word=$1; shift
- for w in "$@"; do
- [[ $w = "$word" ]] && return
- done
-}
-
-__get_users() {
- local a b
- loginctl list-users --no-legend --no-pager | { while read a b; do echo " $b"; done; };
-}
-
-__get_slices() {
- local a b
- systemctl list-units -t slice --no-legend --no-pager | { while read a b; do echo " $a"; done; };
-}
+#Common functions
+. ./systemd-helpers
-__get_machines() {
- local a b
- machinectl list --no-legend --no-pager | { while read a b; do echo " $a"; done; };
-}
-
-__get_env() {
- local a
- env | { while read a; do echo " ${a%%=*}"; done; };
-}
-
-__get_interfaces(){
- cut -f 1 -d ' ' /proc/net/dev | tail -n +3 | tr -s '\n' | tr -d ':' | xargs
-}
_systemd_nspawn() {
local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
@@ -62,14 +35,14 @@ _systemd_nspawn() {
_init_completion || return
- if __contains_word "$prev" ${OPTS[ARG]}; then
+ if __systemdh_contains_word "$prev" ${OPTS[ARG]}; then
case $prev in
--directory|-D)
compopt -o nospace
comps=$(compgen -S/ -A directory -- "$cur" )
;;
--user|-u)
- comps=$( __get_users )
+ comps=$( __systemdh_get_users )
;;
--uuid)
comps=''
@@ -96,13 +69,13 @@ _systemd_nspawn() {
comps=$(compgen -S/ -A directory -- "$cur" )
;;
--machine|-M)
- comps=$( __get_machines )
+ comps=$( __systemdh_get_machines )
;;
--slice|-S)
- comps=$( __get_slices )
+ comps=$( __systemdh_get_slices )
;;
--setenv)
- comps=$( __get_env )
+ comps=$( __systemdh_get_env )
;;
--selinux-context|-Z)
comps=''
@@ -114,7 +87,7 @@ _systemd_nspawn() {
comps='yes no'
;;
--network-interface)
- comps=$(__get_interfaces)
+ comps=$(__systemdh_get_interfaces)
;;
--network-bridge)
comps=''
diff --git a/shell-completion/bash/systemd-run b/shell-completion/bash/systemd-run
index 712655c..f459760 100644
--- a/shell-completion/bash/systemd-run
+++ b/shell-completion/bash/systemd-run
@@ -17,46 +17,36 @@
# You should have received a copy of the GNU Lesser General Public License
# along with systemd; If not, see <http://www.gnu.org/licenses/>.
-__systemctl() {
- local mode=$1; shift 1
- systemctl $mode --full --no-legend "$@"
-}
-
-__get_slice_units () { __systemctl $1 list-units --all -t slice \
- | { while read -r a b c d; do echo " $a"; done; }; }
-
-__get_machines() {
- local a b
- machinectl list --no-legend --no-pager | { while read a b; do echo " $a"; done; };
-}
+#Common functions
+. ./systemd-helpers
_systemd_run() {
local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
local OPTS='-h --help --version --user --system --scope --unit --description --slice
- -r --remain-after-exit --send-sighup -H --host -M --machine --service-type
- --uid --gid --nice --setenv -p --property'
+ -r --remain-after-exit --send-sighup -H --host -M --machine --service-type
+ --uid --gid --nice --setenv -p --property'
- local mode=--system
- local i
- for (( i=1; i <= COMP_CWORD; i++ )); do
- if [[ ${COMP_WORDS[i]} != -* ]]; then
- local root_command=${COMP_WORDS[i]}
- _command_offset $i
- return
+ local mode=--system
+ local i
+ for (( i=1; i <= COMP_CWORD; i++ )); do
+ if [[ ${COMP_WORDS[i]} != -* ]]; then
+ local root_command=${COMP_WORDS[i]}
+ _command_offset $i
+ return
fi
[[ ${COMP_WORDS[i]} == "--user" ]] && mode=--user
[[ $i -lt $COMP_CWORD && ${COMP_WORDS[i]} == @(--unit|--description|--slice|--service-type|-H|--host|-M|--machine|-p|--property) ]] &&
((i++))
- done
+ done
case "$prev" in
--unit|--description)
- # argument required but no completions available
+# argument required but no completions available
return
;;
--slice)
- local comps=$(__get_slice_units $mode)
+ local comps=$(__systemdh_get_slices $mode)
COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
return 0
@@ -69,13 +59,13 @@ _systemd_run() {
;;
-p|--property)
local comps='CPUAccounting= MemoryAccounting= BlockIOAccounting= SendSIGHUP=
- SendSIGKILL= MemoryLimit= CPUShares= BlockIOWeight= User= Group=
- DevicePolicy= KillMode= DeviceAllow= BlockIOReadBandwidth=
- BlockIOWriteBandwidth= BlockIODeviceWeight= Nice= Environment=
- KillSignal= LimitCPU= LimitFSIZE= LimitDATA= LimitSTACK=
- LimitCORE= LimitRSS= LimitNOFILE= LimitAS= LimitNPROC=
- LimitMEMLOCK= LimitLOCKS= LimitSIGPENDING= LimitMSGQUEUE=
- LimitNICE= LimitRTPRIO= LimitRTTIME='
+ SendSIGKILL= MemoryLimit= CPUShares= BlockIOWeight= User= Group=
+ DevicePolicy= KillMode= DeviceAllow= BlockIOReadBandwidth=
+ BlockIOWriteBandwidth= BlockIODeviceWeight= Nice= Environment=
+ KillSignal= LimitCPU= LimitFSIZE= LimitDATA= LimitSTACK=
+ LimitCORE= LimitRSS= LimitNOFILE= LimitAS= LimitNPROC=
+ LimitMEMLOCK= LimitLOCKS= LimitSIGPENDING= LimitMSGQUEUE=
+ LimitNICE= LimitRTPRIO= LimitRTTIME='
COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
return 0
@@ -87,15 +77,15 @@ _systemd_run() {
return 0
;;
-M|--machine)
- local comps=$( __get_machines )
+ local comps=$( __systemdh_get_machines )
COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
return 0
;;
- esac
+ esac
- COMPREPLY=( $(compgen -W '${OPTS[*]}' -- "$cur") )
- return 0
+ COMPREPLY=( $(compgen -W '${OPTS[*]}' -- "$cur") )
+ return 0
}
complete -F _systemd_run systemd-run
diff --git a/shell-completion/bash/timedatectl b/shell-completion/bash/timedatectl
index 1a0acc6..e07661d 100644
--- a/shell-completion/bash/timedatectl
+++ b/shell-completion/bash/timedatectl
@@ -17,12 +17,8 @@
# You should have received a copy of the GNU Lesser General Public License
# along with systemd; If not, see <http://www.gnu.org/licenses/>.
-__contains_word () {
- local w word=$1; shift
- for w in "$@"; do
- [[ $w = "$word" ]] && return
- done
-}
+#Common functions
+. ./systemd-helpers
_timedatectl() {
local i verb comps
@@ -30,7 +26,7 @@ _timedatectl() {
local OPTS='-h --help --version --adjust-system-clock --no-pager
--no-ask-password -H --host'
- if __contains_word "$prev" $OPTS; then
+ if __systemdh_contains_word "$prev" $OPTS; then
case $prev in
--host|-H)
comps=''
@@ -53,7 +49,7 @@ _timedatectl() {
)
for ((i=0; i < COMP_CWORD; i++)); do
- if __contains_word "${COMP_WORDS[i]}" ${VERBS[*]}; then
+ if __systemdh_contains_word "${COMP_WORDS[i]}" ${VERBS[*]}; then
verb=${COMP_WORDS[i]}
break
fi
@@ -61,11 +57,11 @@ _timedatectl() {
if [[ -z $verb ]]; then
comps=${VERBS[*]}
- elif __contains_word "$verb" ${VERBS[BOOLEAN]}; then
+ elif __systemdh_contains_word "$verb" ${VERBS[BOOLEAN]}; then
comps='true false'
- elif __contains_word "$verb" ${VERBS[TIMEZONES]}; then
+ elif __systemdh_contains_word "$verb" ${VERBS[TIMEZONES]}; then
comps=$(command timedatectl list-timezones)
- elif __contains_word "$verb" ${VERBS[STANDALONE]} ${VERBS[TIME]}; then
+ elif __systemdh_contains_word "$verb" ${VERBS[STANDALONE]} ${VERBS[TIME]}; then
comps=''
fi
diff --git a/shell-completion/bash/udevadm b/shell-completion/bash/udevadm
index b828b8d..b24b7be 100644
--- a/shell-completion/bash/udevadm
+++ b/shell-completion/bash/udevadm
@@ -17,17 +17,9 @@
# You should have received a copy of the GNU Lesser General Public License
# along with systemd; If not, see <http://www.gnu.org/licenses/>.
-__contains_word () {
- local w word=$1; shift
- for w in "$@"; do
- [[ $w = "$word" ]] && return
- done
-}
+#Common functions
+. ./systemd-helpers
-__get_all_sysdevs() {
- local -a devs=(/sys/bus/*/devices/*/ /sys/class/*/*/)
- printf '%s\n' "${devs[@]%/}"
-}
_udevadm() {
local i verb comps
@@ -37,8 +29,8 @@ _udevadm() {
local verbs=(info trigger settle control monitor hwdb test-builtin test)
for ((i=0; i < COMP_CWORD; i++)); do
- if __contains_word "${COMP_WORDS[i]}" "${verbs[@]}" &&
- ! __contains_word "${COMP_WORDS[i-1]}" ${OPTS[ARG]}; then
+ if __systemdh_contains_word "${COMP_WORDS[i]}" "${verbs[@]}" &&
+ ! __systemdh_contains_word "${COMP_WORDS[i-1]}" ${OPTS[ARG]}; then
verb=${COMP_WORDS[i]}
break
fi
@@ -54,7 +46,7 @@ _udevadm() {
if [[ $cur = -* ]]; then
comps='--help --query= --path= --name= --root --attribute-walk --export-db --cleanup-db'
else
- comps=$( __get_all_sysdevs )
+ comps=$( __systemdh_get_sysdevs )
fi
;;
'trigger')
@@ -79,7 +71,7 @@ _udevadm() {
if [[ $cur = -* ]]; then
comps='--help --action='
else
- comps=$( __get_all_sysdevs )
+ comps=$( __systemdh_get_sysdevs )
fi
;;
'test-builtin')
diff --git a/Makefile.am b/Makefile.am
index aa5580b..30f1f0f 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -406,6 +406,7 @@ systemgenerator_PROGRAMS = \
systemd-debug-generator
dist_bashcompletion_DATA = \
+ shell-completion/bash/systemd-helpers \
shell-completion/bash/busctl \
shell-completion/bash/journalctl \
shell-completion/bash/systemd-analyze \
--
2.1.0
More information about the systemd-devel
mailing list