summaryrefslogtreecommitdiff
path: root/Completion/Unix/Command/_rsync
diff options
context:
space:
mode:
authorAndrey Borzenkov <bor@users.sourceforge.net>2005-03-26 22:15:33 +0000
committerAndrey Borzenkov <bor@users.sourceforge.net>2005-03-26 22:15:33 +0000
commitc7d4b71f5afccfa5eacc8367fe15a105e3e07339 (patch)
tree553985013315c9b82a4cee3c35c6695c3cd92c9a /Completion/Unix/Command/_rsync
parent35744737039035cd2029b0f248ffa136760fb1dc (diff)
downloadzsh-c7d4b71f5afccfa5eacc8367fe15a105e3e07339.tar.gz
zsh-c7d4b71f5afccfa5eacc8367fe15a105e3e07339.zip
21066: rsync:// support and more fixes
Diffstat (limited to 'Completion/Unix/Command/_rsync')
-rw-r--r--Completion/Unix/Command/_rsync53
1 files changed, 35 insertions, 18 deletions
diff --git a/Completion/Unix/Command/_rsync b/Completion/Unix/Command/_rsync
index 026a6a93e..d7b611c26 100644
--- a/Completion/Unix/Command/_rsync
+++ b/Completion/Unix/Command/_rsync
@@ -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
}