From 9fb925859b1a004d2a45227a22eabf3cf3406341 Mon Sep 17 00:00:00 2001 From: Daniel Hahler Date: Wed, 27 May 2015 21:26:26 +0200 Subject: [PATCH] zsh-completion: optimize _filter_units_by_property Optimize _filter_units_by_property by calling `systemctl` only once with a list of units, and not once per unit. I could not reproduce the "Unknown unit" error mentioned in a FIXME, which might have made this necessary previously. --- shell-completion/zsh/_systemctl.in | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/shell-completion/zsh/_systemctl.in b/shell-completion/zsh/_systemctl.in index 1dc6406..82525de 100644 --- a/shell-completion/zsh/_systemctl.in +++ b/shell-completion/zsh/_systemctl.in @@ -129,16 +129,11 @@ _systemctl_really_all_units() _filter_units_by_property() { local property=$1 value=$2 ; shift ; shift local -a units ; units=($*) - local prop unit - for ((i=1; $i <= ${#units[*]}; i++)); do - # FIXME: "Failed to issue method call: Unknown unit" errors are ignored for - # now (related to DBUS_ERROR_UNKNOWN_OBJECT). in the future, we need to - # revert to calling 'systemctl show' once for all units, which is way - # faster - unit=${units[i]} - prop=${(f)"$(_call_program units "$service show --no-pager --property="$property" ${unit} 2>/dev/null")"} - if [[ "${prop}" = "$property=$value" ]]; then - echo -E - " ${unit}" + local props + for props in ${(ps:\n\n:)"$(_call_program units "$service show --no-pager --property="Id,$property" -- ${units} 2>/dev/null")"}; do + props=(${(f)props}) + if [[ "${props[2]}" = "$property=$value" ]]; then + echo -E - " ${props[1]#Id=}" fi done } -- 2.4.1.dirty