72 lines
3.6 KiB
Diff
72 lines
3.6 KiB
Diff
|
From c6c61aa02fc16388acdb1a04ab6192d7c749d492 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
|
||
|
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 1c44a8df01..9e538a9a5b 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 \
|
||
|
@@ -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
|