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 9ff8af5460)
This commit is contained in:
Zbigniew Jędrzejewski-Szmek
2014-10-30 00:03:38 -04:00
parent 2a7401c74e
commit b5d7c81b89
+14 -13
View File
@@ -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