Skip to content

Commit

Permalink
zsh: reintroduce pattern argument to uncached verbs
Browse files Browse the repository at this point in the history
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.

(cherry picked from commit 2cbda74)
  • Loading branch information
rpigott authored and keszybz committed Aug 9, 2023
1 parent 9814972 commit dfc0445
Showing 1 changed file with 24 additions and 6 deletions.
30 changes: 24 additions & 6 deletions shell-completion/zsh/_systemctl.in
Original file line number Diff line number Diff line change
Expand Up @@ -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:]]*} ) )
}

Expand All @@ -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
Expand Down

0 comments on commit dfc0445

Please sign in to comment.