chiark / gitweb /
bash-completion: rework startable/restartable units once more
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 30 Oct 2014 02:25:33 +0000 (22:25 -0400)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 30 Oct 2014 03:48:09 +0000 (23:48 -0400)
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.

shell-completion/bash/systemctl.in

index 1c44a8d..9e538a9 100644 (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  \
@@ -186,15 +189,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