]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
zsh: reintroduce pattern argument to uncached verbs 28710/head
authorRonan Pigott <ronan@rjp.ie>
Tue, 8 Aug 2023 08:30:28 +0000 (01:30 -0700)
committerRonan Pigott <ronan@rjp.ie>
Tue, 8 Aug 2023 08:57:45 +0000 (01:57 -0700)
The systemctl completion previously made use of PREFIX as a pattern
argument to list-unit-files and list-units. This had the problem of
erroneously filtering the results that were stored in the cache, and
erroneously filtering results that might have been requested according
to the users configuration (e.g. _correct completer, certain
matcher-lists or tag-orders, etc.).

Unfortunately, the runtime of list-unit-files increases when no pattern
argument is provided, and systemctl show, used to filter those units,
can become unacceptably slow when provided with too many units to
describe.

Let's re-introduce the pattern argument to list-unit-files and
list-units where necessary in order to alleviate these bottlenecks
without poisining the cache. A 'use-pattern' style is introduced that
may be used to disable this behavior if it is undesired. We can still
expect that certain completions, like `systemctl start <TAB>` will be
slow, like before. To fix this we will need systemd to learn a more
efficient way of filtering the units than parsing systemctl show.

shell-completion/zsh/_systemctl.in

index 7b67ece1b0cb4d5ef87ec22d7657cc8b619075e9..54e34a1781e169f58fe2d6c48aead7c794edd1d3 100644 (file)
@@ -206,23 +206,37 @@ __systemctl()
     }
 
 (( $+functions[_systemctl_active_units] )) ||
-    _systemctl_active_units()  {_sys_active_units=(  ${${(f)"$(__systemctl list-units)"}%% *} )}
+    _systemctl_active_units()  {
+        local pattern
+        if zstyle -T ":completion:$curcontext" use-pattern; then
+            pattern="$PREFIX*$SUFFIX"
+        fi
+        _sys_active_units=(  ${${(f)"$(__systemctl list-units $pattern)"}%% *} )
+    }
 
 (( $+functions[_systemctl_startable_units] )) ||
     _systemctl_startable_units(){
+        local pattern
+        if zstyle -T ":completion:$curcontext" use-pattern; then
+            pattern="$PREFIX*$SUFFIX"
+        fi
         _sys_startable_units=( $( _filter_units_by_property ActiveState inactive $(
                                       _filter_units_by_property CanStart yes ${${${(f)"$(
-      __systemctl list-unit-files --state enabled,enabled-runtime,linked,linked-runtime,static,indirect,disabled,generated,transient
-      __systemctl list-units --state inactive,failed
+      __systemctl list-unit-files --state enabled,enabled-runtime,linked,linked-runtime,static,indirect,disabled,generated,transient $pattern
+      __systemctl list-units --state inactive,failed $pattern
     )"}:#*@.*}%%[[:space:]]*}
                                                             )) )
     }
 
 (( $+functions[_systemctl_restartable_units] )) ||
     _systemctl_restartable_units(){
+        local pattern
+        if zstyle -T ":completion:$curcontext" use-pattern; then
+            pattern="$PREFIX*$SUFFIX"
+        fi
         _sys_restartable_units=( $( _filter_units_by_property CanStart yes ${${${(f)"$(
-    __systemctl list-unit-files --state enabled,disabled,static
-    __systemctl list-units
+    __systemctl list-unit-files --state enabled,disabled,static $pattern
+    __systemctl list-units $pattern
   )"}:#*@.*}%%[[:space:]]*} ) )
     }
 
@@ -232,8 +246,12 @@ __systemctl()
 (( $+functions[_systemctl_unit_state] )) ||
     _systemctl_unit_state() {
         setopt localoptions extendedglob
+        local pattern
+        if zstyle -T ":completion:$curcontext" use-pattern; then
+            pattern="$PREFIX*$SUFFIX"
+        fi
         typeset -gA _sys_unit_state
-        _sys_unit_state=( ${=${${(f)"$(__systemctl list-unit-files)"}%%[[:space:]]#}% *} )
+        _sys_unit_state=( ${=${${(f)"$(__systemctl list-unit-files $pattern)"}%%[[:space:]]#}% *} )
     }
 
 local fun