From b5d7c81b899452f4c30d056f15982be424d8d6be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Wed, 29 Oct 2014 22:25:33 -0400 Subject: [PATCH] bash-completion: rework startable/restartable units once more I tried to use 'systemctl --all list-units' to filter unit files, but this always filters out unit files which are not loaded. We want to complete systemctl start with those units too, so this approach is not going to work. New version is rather slow, but hopefully correct. (cherry picked from commit 9ff8af5460d57dfab78a1137ec743b539715e82a) --- shell-completion/bash/systemctl.in | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/shell-completion/bash/systemctl.in b/shell-completion/bash/systemctl.in index 3c52d2b20..8ef4070f5 100644 --- a/shell-completion/bash/systemctl.in +++ b/shell-completion/bash/systemctl.in @@ -52,20 +52,23 @@ __filter_units_by_property () { } __get_all_units () { { __systemctl $1 list-unit-files; __systemctl $1 list-units --all; } \ - | { while read -r a b; do echo " $a"; done; }; } + | { while read -r a b; do [[ $a =~ @\. ]] || echo " $a"; done; }; } __get_template_names () { __systemctl $1 list-unit-files \ | { while read -r a b; do [[ $a =~ @\. ]] && echo " ${a%%@.*}@"; done; }; } __get_active_units () { __systemctl $1 list-units \ | { while read -r a b; do echo " $a"; done; }; } __get_startable_units () { - # find inactive or failed units, filter out masked and not-found - __systemctl $1 list-units --state inactive,failed -- $( __get_all_units ) | \ - { while read -r a b c d; do [[ $b == "loaded" ]] && echo " $a"; done; }; } + # find startable inactive units + __filter_units_by_property $mode LoadState loaded $( + __filter_units_by_property $mode ActiveState inactive $( + __filter_units_by_property $mode CanStart yes $( __get_all_units ))) +} __get_restartable_units () { - # find !masked, filter out masked and not-found - __systemctl $1 list-units --state active,inactive,failed -- $( __get_all_units ) | \ - { while read -r a b c d; do [[ $b == "loaded" ]] && echo " $a"; done; }; } + # filter out masked and not-found + __filter_units_by_property $mode LoadState loaded $( + __filter_units_by_property $mode CanStart yes $( __get_all_units )) +} __get_failed_units () { __systemctl $1 list-units \ | { while read -r a b c d; do [[ $c == "failed" ]] && echo " $a"; done; }; } __get_enabled_units () { __systemctl $1 list-unit-files \ @@ -183,15 +186,13 @@ _systemctl () { compopt -o filenames elif __contains_word "$verb" ${VERBS[STARTABLE_UNITS]}; then - comps=$( __filter_units_by_property $mode CanStart yes \ - $( __get_startable_units $mode); - __get_template_names $mode) + comps=$( __get_startable_units $mode; + __get_template_names $mode) compopt -o filenames elif __contains_word "$verb" ${VERBS[RESTARTABLE_UNITS]}; then - comps=$( __filter_units_by_property $mode CanStart yes \ - $( __get_restartable_units $mode); \ - __get_template_names $mode) + comps=$( __get_restartable_units $mode; + __get_template_names $mode) compopt -o filenames elif __contains_word "$verb" ${VERBS[STOPPABLE_UNITS]}; then