summary refs log tree commit diff
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
parentf2b6650b43688eb38ffe88b3ed3c819b48fa141c (diff)
downloadzsh-c4b19f7fc4707321801973b259387c4e59de90cd.tar.gz
zsh-c4b19f7fc4707321801973b259387c4e59de90cd.tar.xz
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.
-rw-r--r--ChangeLog3
-rw-r--r--Completion/Unix/Type/_ssh_hosts9
2 files changed, 8 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 39efef8eb..fcebf9b4a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2021-10-26  Oliver Kiddle  <opk@zsh.org>
 
+	* Peter Palfrader: 49431 (tweaked, c.f. Bart: 49434):
+	Completion/Unix/Type/_ssh_hosts: Faster ~/.ssh/config processing
+
 	* Marlon: 49521: Doc/Zsh/compwid.yo, Test/Y02compmatch.ztst:
 	Define correct behavior of || completion matchers
 
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