From 7ca3cae97bfb9ba163cb298150816b591ad2e0c7 Mon Sep 17 00:00:00 2001 From: Ronan Pigott Date: Tue, 8 Aug 2023 01:30:28 -0700 Subject: [PATCH] zsh: reintroduce pattern argument to uncached verbs 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 ` 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. (cherry picked from commit 2cbda74862049be2003496c7d432341d53a0fdf9) (cherry picked from commit dfc0445cb86e500732125da9f758092641a4c5a2) --- shell-completion/zsh/_systemctl.in | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/shell-completion/zsh/_systemctl.in b/shell-completion/zsh/_systemctl.in index e1c51c3056..759ffc0206 100644 --- a/shell-completion/zsh/_systemctl.in +++ b/shell-completion/zsh/_systemctl.in @@ -202,23 +202,37 @@ __systemctl() _systemctl_get_template_names() { echo -E - ${^${(M)${(f)"$(__systemctl list-unit-files)"}##*@.[^[:space:]]##}%%@.*}\@ } (( $+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:]]*} ) ) } @@ -228,8 +242,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