Mercurial > dotfiles
comparison .zfun/_subversion @ 73:b84c4cac3148
Add custom _subversion that works with svn 1.5 and later.
| author | Augie Fackler <durin42@gmail.com> |
|---|---|
| date | Thu, 09 Apr 2009 13:24:38 -0500 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 72:d23dde77450a | 73:b84c4cac3148 |
|---|---|
| 1 #compdef svn svnadmin svnadmin-static=svnadmin | |
| 2 | |
| 3 _svn () { | |
| 4 local curcontext="$curcontext" state line expl ret=1 | |
| 5 | |
| 6 _arguments -C \ | |
| 7 '(-)--help[print help information]' \ | |
| 8 '(- *)--version[print client version information]' \ | |
| 9 '1: :->cmds' \ | |
| 10 '*:: :->args' && ret=0 | |
| 11 | |
| 12 if [[ -n $state ]] && (( ! $+_svn_cmds )); then | |
| 13 typeset -gHA _svn_cmds | |
| 14 _svn_cmds=( | |
| 15 ${=${(f)${${"$(LC_ALL=C _call_program commands svn help)"#l#*Available subcommands:}%%Subversion is a tool*}}/(#s)[[:space:]]#(#b)([a-z]##)[[:space:]]#(\([a-z, ?]##\))#/$match[1] :$match[1]${match[2]:+:${${match[2]//[(),]}// /:}}:} | |
| 16 ) | |
| 17 fi | |
| 18 | |
| 19 case $state in | |
| 20 cmds) | |
| 21 _wanted commands expl 'svn command' _svn_commands && ret=0 | |
| 22 ;; | |
| 23 args) | |
| 24 local cmd args usage | |
| 25 typeset -gHA _cache_svn_status | |
| 26 | |
| 27 cmd="${${(k)_svn_cmds[(R)*:$words[1]:*]}:-${(k)_svn_cmds[(i):$words[1]:]}}" | |
| 28 if (( $#cmd )); then | |
| 29 curcontext="${curcontext%:*:*}:svn-${cmd}:" | |
| 30 | |
| 31 usage=${${(M)${(f)"$(LC_ALL=C _call_program options svn help $cmd)"}:#usage:*}#usage:*$cmd] } | |
| 32 args=( | |
| 33 ${=${${${(M)${(f)"$(LC_ALL=C _call_program options svn help $cmd)"##*Valid options:}:#* :*}%% #:*}/ ARG/:arg:}/(#b)-([[:alpha:]]) \[--([a-z-]##)\](:arg:)#/(--$match[2])-$match[1]$match[3] (-$match[1])--$match[2]$match[3]} | |
| 34 ) | |
| 35 | |
| 36 case $cmd in; | |
| 37 (add) | |
| 38 args+=( | |
| 39 '*:file:_files -g "*(^e:_svn_controlled:)"' | |
| 40 ) | |
| 41 ;; | |
| 42 (commit) | |
| 43 args=( | |
| 44 ${args/(#b)(*--file*):arg:/$match[1]:file:_files} | |
| 45 '*:file:_files -g "*(e:_svn_status:)"' | |
| 46 ) | |
| 47 ;; | |
| 48 (delete) | |
| 49 args+=( | |
| 50 '*:file:_files -g ".svn(/e:_svn_deletedfiles:)"' | |
| 51 ) | |
| 52 ;; | |
| 53 (diff) | |
| 54 args+=( | |
| 55 '*: : _alternative "files:file:_files -g \*\(e:_svn_status:\)" "urls:URL:_svn_urls"' | |
| 56 ) | |
| 57 ;; | |
| 58 (help) | |
| 59 args+=( | |
| 60 '*::sub command:_svn_commands' | |
| 61 ) | |
| 62 ;; | |
| 63 (import) | |
| 64 args+=( | |
| 65 '1:project directory or import location: _alternative "files:file:_files" "urls:URL:_svn_urls"' | |
| 66 '2:import location: _alternative "files:file:_files" "urls:URL:_svn_urls"' | |
| 67 ) | |
| 68 ;; | |
| 69 (log) | |
| 70 args+=( | |
| 71 '1: : _alternative "files:file:_files -g \*\(e:_svn_controlled:\)" "urls:URL:_svn_urls"' | |
| 72 '*:file:_files -g "*(e:_svn_controlled:)"' | |
| 73 ) | |
| 74 ;; | |
| 75 (propset) | |
| 76 args=( | |
| 77 ':propname:(svn:ignore svn:keywords svn:executable svn:eol-style svn:mime-type svn:externals svn:needs-lock)' | |
| 78 ${args/(#b)(*--file*):arg:/$match[1]:file:_files} | |
| 79 '*:path or url: _alternative "files:file:_files" "urls:URL:_svn_urls"' | |
| 80 ) | |
| 81 ;; | |
| 82 (resolved) | |
| 83 args+=( | |
| 84 '*:file:_files -g "*(e:_svn_conflicts:)"' | |
| 85 ) | |
| 86 ;; | |
| 87 (revert) | |
| 88 args+=( | |
| 89 '*:file:_files -g "(.svn|*)(/e:_svn_deletedfiles:,e:_svn_status:)"' | |
| 90 ) | |
| 91 ;; | |
| 92 (*) | |
| 93 case $usage in | |
| 94 *(SRC|DST|TARGET|URL*PATH)*) | |
| 95 args+=( | |
| 96 '*: : _alternative "files:file:_files" "urls:URL:_svn_urls"' | |
| 97 ) | |
| 98 ;; | |
| 99 *URL*) args+=( ':URL:_svn_urls' ) ;; | |
| 100 *PATH*) args+=( '*:file:_files' ) ;; | |
| 101 esac | |
| 102 ;; | |
| 103 esac | |
| 104 | |
| 105 _arguments "$args[@]" && ret=0 | |
| 106 | |
| 107 else | |
| 108 _message "unknown svn command: $words[1]" | |
| 109 fi | |
| 110 ;; | |
| 111 esac | |
| 112 | |
| 113 return ret | |
| 114 } | |
| 115 | |
| 116 _svnadmin () { | |
| 117 local curcontext="$curcontext" state line ret=1 | |
| 118 | |
| 119 _arguments -C \ | |
| 120 '(-)--help[print help information]' \ | |
| 121 '(- *)--version[print client version information]' \ | |
| 122 '1: :->cmds' \ | |
| 123 '*:: :->args' && ret=0 | |
| 124 | |
| 125 if [[ -n $state ]] && (( ! $+_svnadmin_cmds )); then | |
| 126 typeset -gHA _svnadmin_cmds | |
| 127 _svnadmin_cmds=( | |
| 128 ${=${(f)${${"$(LC_ALL=C _call_program commands svnadmin help)"#l#*Available subcommands:}}}/(#s)[[:space:]]#(#b)([-a-z]##)[[:space:]]#(\([a-z, ?]##\))#/$match[1] :$match[1]${match[2]:+:${${match[2]//[(),]}// /:}}:} | |
| 129 ) | |
| 130 fi | |
| 131 | |
| 132 case $state in | |
| 133 cmds) | |
| 134 _wanted commands expl 'svnadmin command' _svnadmin_commands && ret=0 | |
| 135 ;; | |
| 136 args) | |
| 137 local cmd args usage | |
| 138 | |
| 139 cmd="${${(k)_svnadmin_cmds[(R)*:$words[1]:*]}:-${(k)_svnadmin_cmds[(i):$words[1]:]}}" | |
| 140 if (( $#cmd )); then | |
| 141 curcontext="${curcontext%:*:*}:svnadmin-${cmd}:" | |
| 142 | |
| 143 usage=${${(M)${(f)"$(LC_ALL=C _call_program options svnadmin help $cmd)"}:#$cmd: usage:*}#$cmd: usage: svnadmin $cmd } | |
| 144 args=( | |
| 145 ${=${${${(M)${(f)"$(LC_ALL=C _call_program options svnadmin help $cmd)"##*Valid options:}:#*:*}%% #:*}/ ARG/:arg:}/(#b)-([[:alpha:]]) \[--([a-z-]##)\](:arg:)#/(--$match[2])-$match[1]$match[3] (-$match[1])--$match[2]$match[3]} | |
| 146 ) | |
| 147 if [[ $_svnadmin_subcmd_usage == *REPOS_PATH* ]]; then | |
| 148 args+=( ":path:_files -/" ) | |
| 149 elif [[ $cmd = help ]]; then | |
| 150 args+=( "*:subcommand:_svnadmin_commands" ) | |
| 151 fi | |
| 152 | |
| 153 _arguments "$args[@]" && ret=0 | |
| 154 else | |
| 155 _message "unknown svnadmin command: $words[1]" | |
| 156 fi | |
| 157 ;; | |
| 158 esac | |
| 159 | |
| 160 return ret | |
| 161 } | |
| 162 | |
| 163 (( $+functions[_svn_controlled] )) || | |
| 164 _svn_controlled() { | |
| 165 [[ -f ${(M)REPLY##*/}.svn/text-base/${REPLY##*/}.svn-base ]] | |
| 166 } | |
| 167 | |
| 168 (( $+functions[_svn_conflicts] )) || | |
| 169 _svn_conflicts() { | |
| 170 [ -n $REPLY.(mine|r<->)(N[1]) ] | |
| 171 } | |
| 172 | |
| 173 (( $+functions[_svn_deletedfiles] )) || | |
| 174 _svn_deletedfiles() { | |
| 175 # Typical usage would be _files -g '.svn(/e:_svn_deletedfiles:)' | |
| 176 local cont controlled | |
| 177 reply=( ) | |
| 178 [[ $REPLY = (*/|).svn ]] || return | |
| 179 controlled=( $REPLY/text-base/*.svn-base(N:r:t) ) | |
| 180 for cont in ${controlled}; do | |
| 181 [[ -e $REPLY:h/$cont ]] || reply+=( ${REPLY%.svn}$cont ) | |
| 182 done | |
| 183 } | |
| 184 | |
| 185 (( $+functions[_svn_status] )) || | |
| 186 _svn_status() { | |
| 187 local dir=$REPLY:h | |
| 188 local pat="${1:-([ADMR~]|?M)}" | |
| 189 | |
| 190 if (( ! $+_cache_svn_status[$dir] )); then | |
| 191 _cache_svn_status[$dir]="$(_call_program files svn status -N $dir)" | |
| 192 fi | |
| 193 | |
| 194 (( ${(M)#${(f)_cache_svn_status[$dir]}:#(#s)${~pat}*$REPLY} )) | |
| 195 } | |
| 196 | |
| 197 (( $+functions[_svn_urls] )) || | |
| 198 _svn_urls() { | |
| 199 local expl remfiles remdispf remdispd suf ret=1 | |
| 200 | |
| 201 if [[ -prefix *: ]] && ! _urls && | |
| 202 zstyle -T ":completion:${curcontext}:" remote-access | |
| 203 then | |
| 204 remfiles=( ${(f)"$(svn list $IPREFIX${PREFIX%%[^./][^/]#} 2>/dev/null)"} ) | |
| 205 compset -P '*/' | |
| 206 compset -S '/*' || suf=file | |
| 207 remdispf=(${remfiles:#*/}) | |
| 208 remdispd=(${(M)remfiles:#*/}) | |
| 209 _tags files | |
| 210 while _tags; do | |
| 211 while _next_label files expl ${suf:-directory}; do | |
| 212 [[ -n $suf ]] && compadd "$@" "$expl[@]" -d remdispf $remdispf && ret=0 | |
| 213 compadd ${suf:+-S/} "$@" "$expl[@]" -d remdispd \ | |
| 214 ${remdispd%/} && ret=0 | |
| 215 done | |
| 216 (( ret )) || return 0 | |
| 217 done | |
| 218 else | |
| 219 compset -S '[^:]*' | |
| 220 _wanted url-schemas expl 'URL schema' compadd -S '' - \ | |
| 221 file:// http:// https:// svn:// svn+ssh:// && ret=0 | |
| 222 fi | |
| 223 | |
| 224 return ret | |
| 225 } | |
| 226 | |
| 227 (( $+functions[_svn_commands] )) || | |
| 228 _svn_commands() { | |
| 229 compadd "$@" -k _svn_cmds || compadd "$@" ${(s.:.)_svn_cmds} | |
| 230 } | |
| 231 | |
| 232 (( $+functions[_svnadmin_command] )) || | |
| 233 _svnadmin_commands() { | |
| 234 compadd "$@" -k _svnadmin_cmds || compadd "$@" ${(s.:.)_svnadmin_cmds} | |
| 235 } | |
| 236 | |
| 237 _subversion () { | |
| 238 case $service in | |
| 239 (svn) _svn "$@" ;; | |
| 240 (svnadmin) _svnadmin "$@" ;; | |
| 241 esac | |
| 242 } | |
| 243 | |
| 244 _subversion "$@" |
