about summary refs log tree commit diff
path: root/Completion/Unix/Command/_rsync
blob: d111b38ba6045e24f3725257eeb6861a97be3ac7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#compdef rsync

_rsync_remote_files() {
local suf tag=accounts

if [[ -prefix *::*/ ]]; then
  local remfiles remdispf remdispd

  compset -P '*::*/'

  remfiles=(${(f)"$(rsync ${words[CURRENT]%/*}/)"})

  remdispf=(${remfiles:#d*})
  remdispd=(${(M)remfiles:#d*})

    _wanted files expl 'remote files and directories' \
      compadd -d remdispf ${remdispf##* }
      
    _wanted files expl 'remote files and directories' \
      compadd -S/ -d remdispd ${remdispd##* }

elif [[ -prefix 1 *:: ]]; then
  local remfiles remmodules

  compset -P 1 '*::'

  remfiles=(${(f)"$(rsync ${words[CURRENT]%::*}::)"})

  remmodules=(${remfiles/[ 	]#/:})

  _describe "remote modules" remmodules -S/

elif [[ -prefix 1 *: ]]; then
  local remfiles remdispf remdispd

  compset -P 1 '*:'

  if zstyle -T ":completion:${curcontext}:" remote-access; then
    remfiles=(${(f)"$(ssh -a -x ${words[CURRENT]%:*} ls -d1F ${${${words[CURRENT
]#*:}:h}/\\/(#e)/}/\* 2>/dev/null)"})

    remdispf=(${remfiles:#*/})
    remdispd=(${(M)remfiles:#*/})

    _wanted files expl 'remote files and directories' \
      compadd -d remdispf ${${remfiles:#*/}/[*=@|](#e)/}
      
    _wanted files expl 'remote files and directories' \
      compadd -S/ -d remdispd ${${(M)remfiles:#*/}/\\/(#e)/}
  else
    _message -e remote-files 'remote files'
  fi

elif [[ -prefix 1 *@ ]]; then
  local user=${PREFIX%%@*}

  compset -P 1 '*@'
  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
	_hosts -S:
   fi

fi

}

_rsync_files() {
_files || _rsync_remote_files
}


_arguments -C -s \
	'*:files:_rsync_files' \
 	'(--verbose)-v[verbose]' \
 	'(-v)--verbose' \
 	'(--quiet)-q[quiet]' \
 	'(-q)--quiet' \
 	'(--checksum)-c[always checksum]' \
 	'(-c)--checksum[always checksum]' \
 	'(--archive)-a[archive mode]' \
 	'(-a)--archive[archive mode]' \
 	'(--recursive)-r[recurse into directories]' \
 	'(-r)--recursive[recurse into directories]' \
 	'(--relative)-R[use relative path names]' \
 	'(-R)--relative[use relative path names]' \
 	'(--backup)-b[make backups]' \
 	'(-b)--backup[make backups]' \
 	'--backup-dir[make backups into this directory]:backup directory:_files -/' \
	'--suffix=[override backup suffix]:suffix:' \
 	'(--update)-u[update only]' \
 	'(-u)--update[update only]' \
 	'(--links)-l[copy symlinks as symlinks]' \
 	'(-l)--links[copy symlinks as symlinks]' \
 	'(--copy-links)-L[copy referent of symlinks]' \
 	'(-L)--copy-links[copy referent of symlinks]' \
 	'--copy-unsafe-links[copy links outside the source tree]' \
 	'--safe-links[ignore links outside the destination tree]' \
 	'(--hard-links)-H[preserve hard links]' \
 	'(-H)--hard-links[preserve hard links]' \
 	'(--perms)-p[preserve permissions]' \
 	'(-p)--perms[preserve permissions]' \
 	'(--owner)-o[preserve owner]' \
 	'(-o)--owner[preserve owner]' \
 	'(--group)-g[preserve group]' \
 	'(-g)--group[preserve group]' \
 	'(--devices)-D[preserve devices]' \
 	'(-D)--devices[preserve devices]' \
 	'(--times)-t[preserve times]' \
 	'(-t)--times[preserve times]' \
 	'(--sparse)-S[handle sparse files efficiently]' \
 	'(-S)--sparse[handle sparse files efficiently]' \
 	'(--dry-run)-n[show what would have been transferred]' \
 	'(-n)--dry-run[show what would have been transferred]' \
 	'(--whole-file)-W[copy whole files]' \
 	'(-W)--whole-file[copy whole files]' \
 	'(--one-file-system)-x[do not cross filesystem boundaries]' \
 	'(-x)-one-file-system[do not cross filesystem boundaries]' \
 	'(--block-size)-B[checksum blocking size]:block size:' \
 	'(-B)--block-size=[checksum blocking size]:block size:' \
 	'(--rsh)-e[rsh command]:remote command:(rsh ssh)' \
 	'(-e)--rsh[rsh command]:remote command:(rsh ssh)' \
	'--rsync-path=[specify path to rsync on the remote machine]:remote command:' \
 	'(--cvs-exclude)-C[autoignore files in the same way as CVS]' \
 	'(-C)--cvs-exclude[autoignore files in the same way as CVS]' \
	'--existing[only update files that already exist]' \
	'--ignore-existing[ignore files that already exist on the receiving side]' \
	'--delete[delete files that do not exist on the sending side]' \
	'--delete-excluded[also delete excluded files on the receiving side]' \
	'--delete-after[perform delete after transferring]' \
	'--ignore-errors[delete even if there are IO errors]' \
	'--max-delete=[do not delete more than NUM files]:number:' \
	'--partial[keep partially transferred files]' \
	'--force[force deletion of directories even if not empty]' \
	'--numeric-ids[do not map uid/gid values by user/group name]' \
	'--timeout=[set IO timeout in seconds]:seconds:' \
 	'(--ignore-times)-I[do not exclude files that match length and time]' \
 	'(-I)--ignore-times[do not exclude files that match length and time]' \
	'--size-only[only use file size when determining if a file should be transferred]' \
	'--modify-window=[timestamp window for file match]:seconds:' \
	'(--temp-dir)-T[create temporary files in specified directory]:directory:_files -/' \
	'(-T)--temp-dir=[create temporary files in specified directory]:directory:_files -/' \
	'--compare-dest=[also compare destination files relative to specified directory]:directory:_files -/' \
	'-P[equivalent to --partial --progress]' \
 	'(--compress)-z[compress file data]' \
 	'(-z)--compress[compress file data]' \
	'--exclude=[exclude files matching pattern]:pattern:' \
	'--exclude-from=[exclude patterns listed in file]:file:_files' \
	'--include=[do not exclude files matching pattern]:pattern:' \
	'--include-from=[do not exclude patterns listed in file]:file:_files' \
	'--version[print version number]' \
	'--daemon[run as a rsync daemon]' \
	'--no-detach[do not detach from the parent]' \
	'--address=[bind to the specified address]:address:_hosts' \
	'--config=[specify alternate rsyncd.conf file]:file:_files' \
	'--port=[specify alternate rsyncd port number]:port:' \
	'--blocking-io[use blocking IO for the remote shell]' \
	'--stats[give some file transfer stats]' \
	'--progress[show progress during transfer]' \
	'--log-format=[log file transfers using specified format]:format:' \
	'--password-file=[get password from file]:file:_files' \
	'--bwlimit=[limit bandwidth]:kbytes per second:' \
	'--read-batch=[read batch file]:ext:' \
	'--write-batch[write batch file]' \
 	'(--help)-h[help]' \
 	'(-h)--help[help]' \
 	'-4[prefer IPv4]' \
 	'-6[prefer IPv6]' \
	   -- '*=COMMAND*:command:_command' \
              '*=FILE*:file:_files' \
              '*=DIR*:directory:_files -/'