Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

[PATCH] _rsync - better rsync:// URL support and other fixes



-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

- - add rsync:// support
- - strip server banner from output (let's hope it is consistent across servers)
- - fix modules completion (it interpreted whole line as description)

it still does not grok rsync://user@server:port/ nor does it support RSYNC_RSH 
or -e (-rsh) options. Probably it should, at least the latter means rsync is 
using rsh not rsync server irrespectively of URL form.

Absolutely ugly "compadd -S/ rsync:/" is the only way I know to add word with 
two slashes without adding blank. Oliver, do you have any idea (the same 
problem I had in _urpmi too).

Oh, and I noticed that I never actually get `Host for "$user"' prompt.

- -andrey

Index: Completion/Unix/Command/_rsync
===================================================================
RCS file: /cvsroot/zsh/zsh/Completion/Unix/Command/_rsync,v
retrieving revision 1.19
diff -u -p -r1.19 _rsync
- --- Completion/Unix/Command/_rsync      11 Mar 2005 19:24:35 -0000      1.19
+++ Completion/Unix/Command/_rsync      26 Mar 2005 21:33:34 -0000
@@ -1,11 +1,32 @@
 #compdef rsync

+_rsync_user_or_host() {
+  local suf=$1 rsync
+  shift
+
+  if compset -P 1 '*@'; then
+    local user=${PREFIX%%@*}
+
+    _wanted -C user-at hosts expl "host for $user" \
+       _combination -s '[:@]' "${tag}" users-hosts users="$user" hosts -S 
"$suf" "$@" -
+  elif compset -S '@*'; then
+      _wanted users expl "user" \
+         _combination -s '[:@]' "${tag}" users-hosts users -q "$@" -
+  else
+    [[ $words[CURRENT] = rsync://* ]] || rsync='rsync:rsync: compadd -S/ 
rsync:/'
+    _alternative \
+      'users:user:_users -S @' \
+      "hosts:host:_hosts -S '$suf'" \
+      $rsync
+  fi
+}
+
 _rsync_remote_files() {
 local expl remfiles remdispf remdispd remmodules suf ret=1 tag=accounts

- -if compset -P '*::*/'; then
+if compset -P '*::*/' || compset -P 'rsync://*/*/'; then

- -  remfiles=(${(f)"$(_call_program files rsync ${words[CURRENT]%/*}/)"})
+  remfiles=(${${(f)"$(_call_program files rsync 
${words[CURRENT]%/*}/)"}:#[   ]*})

   remdispf=(${remfiles:#d*})
   remdispd=(${(M)remfiles:#d*})
@@ -16,14 +37,22 @@ if compset -P '*::*/'; then
   _wanted files expl 'remote file or directory' \
       compadd -S/ -d remdispd ${remdispd##* }

- -elif compset -P 1 '*::'; then
+elif compset -P 1 '*::' || compset -P 1 'rsync://*/'; then
+
+  local pat=${words[CURRENT]}

- -  remfiles=(${(f)"$(_call_program files rsync ${words[CURRENT]%::*}::)"})
+  if [[ $pat = *:: ]]; then
+    pat=${pat%::*}::
+  fi

- -  remmodules=(${remfiles/[     ]#/:})
+  remfiles=(${${(f)"$(_call_program files rsync $pat)"}:#[     ]*})
+
+  remmodules=(${remfiles/[     ]##/:})

   _describe "remote modules" remmodules -S/

+elif compset -P 'rsync://'; then
+  _rsync_user_or_host / "$@"
 elif compset -P 1 '*:'; then

   if zstyle -T ":completion:${curcontext}:files" remote-access; then
@@ -48,20 +77,8 @@ elif compset -P 1 '*:'; then
     _message -e remote-files 'remote file'
   fi

- -elif compset -P 1 '*@'; then
- -  local user=${PREFIX%%@*}
- -
- -  compset -S ':*' || suf=":"
- -
- -  _wanted -C user-at hosts expl "host for $user" \
- -      _combination -s '[:@]' "${tag}" users-hosts users="$user" hosts -S 
"$suf" "$@" -
 else
- -  if compset -S '@*'; then
- -    _wanted users expl "user" \
- -       _combination -s '[:@]' "${tag}" users-hosts users -q "$@" -
- -  else
- -    _alternative 'users:user:_users -S @' 'hosts:host:_hosts -S:'
- -  fi
+  _rsync_user_or_host : "$@"
 fi

 }
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.0 (GNU/Linux)

iD8DBQFCRdX9R6LMutpd94wRAhQuAKCWIjvT5S3FojItMvZux6X+MV+gUwCfUyGQ
+myYKLE5+EysA3rbNgjousA=
=clim
-----END PGP SIGNATURE-----



Messages sorted by: Reverse Date, Date, Thread, Author