summaryrefslogtreecommitdiff
path: root/Completion/Unix
diff options
context:
space:
mode:
authorPeter Palfrader <peter@palfrader.org>2021-09-22 10:25:08 +0200
committerOliver Kiddle <opk@zsh.org>2021-10-26 21:56:23 +0200
commitc4b19f7fc4707321801973b259387c4e59de90cd (patch)
tree8155f9cc8034e6bb1c0154e086ce3942cbcaa495 /Completion/Unix
parentf2b6650b43688eb38ffe88b3ed3c819b48fa141c (diff)
downloadzsh-c4b19f7fc4707321801973b259387c4e59de90cd.tar.gz
zsh-c4b19f7fc4707321801973b259387c4e59de90cd.zip
49431 (tweaked, c.f. Bart: 49434): Faster ~/.ssh/config processing
When iterating over the ssh config file, iterate over the array linearly instead of always processing the first and then removing it from the list. This speeds up processing significantly.
Diffstat (limited to 'Completion/Unix')
-rw-r--r--Completion/Unix/Type/_ssh_hosts9
1 files changed, 5 insertions, 4 deletions
diff --git a/Completion/Unix/Type/_ssh_hosts b/Completion/Unix/Type/_ssh_hosts
index bd5366425..a4a08ad91 100644
--- a/Completion/Unix/Type/_ssh_hosts
+++ b/Completion/Unix/Type/_ssh_hosts
@@ -20,8 +20,9 @@ if [[ -r $config ]]; then
local key line host
local -a lines=("${(@f)$(<"$config")}") 2>/dev/null
local -a match_args
- while (($#lines)); do
- IFS=$'=\t ' read -r key line <<<"${lines[1]}"
+ local idx=1
+ while (( idx <= $#lines )); do
+ IFS=$'=\t ' read -r key line <<<"${lines[idx]}"
if [[ "$key" == ((#i)match) ]]; then
match_args=(${(z)line})
while [[ $#match_args -ge 2 ]]; do
@@ -35,7 +36,7 @@ if [[ -r $config ]]; then
fi
case "$key" in
((#i)include)
- lines[1]=("${(@f)$(cd $HOME/.ssh; cat ${(z)~line})}") 2>/dev/null;;
+ lines[idx]=("${(@f)$(cd $HOME/.ssh; cat ${(z)~line})}") 2>/dev/null;;
((#i)host(|name))
for host in ${(z)line}; do
case $host in
@@ -43,7 +44,7 @@ if [[ -r $config ]]; then
(*) config_hosts+=("$host") ;;
esac
done ;&
- (*) shift lines;;
+ (*) (( ++idx ));;
esac
done
if (( ${#config_hosts} )); then