1#compdef chown chgrp 2 3local curcontext="$curcontext" state line expl ret=1 4local suf usr grp req deref args 5 6if _pick_variant gnu=Free\ Soft unix --version; then 7 args=( 8 '(-c --changes -v --verbose)'{-c,--changes}'[report each change made]' 9 '(-c --changes -v --verbose)'{-v,--verbose}'[output info for every file processed]' 10 '(-h --no-dereference)--dereference[dereference symlinks]' 11 '(-h --no-dereference --dereference)'{-h,--no-dereference}'[operate on symlinks them self]' 12 '(-f --silent --quiet)'{-f,--silent,--quiet}"[don't report errors]" 13 '--reference=[copy ownership of specified file]:file:_files' 14 '(-R --recursive)'{-R,--recursive}'[change files and directories recursively]' 15 '(- : *)--help[display help information]' 16 '(- : *)--version[display version information]' 17 ) 18 [[ $service = chown ]] && 19 args+=( '--from=[restrict changes to files by current ownership]: :->owner' ) 20else 21 # based on $OSTYPE = solaris2.8 22 args=( 23 "-f[don't report errors]" 24 "-h[operate on symlinks them self]" 25 '-R[change files and directories recursively]' 26 ) 27fi 28 29(( $+words[(r)--reference*] )) || args+=( '(--reference)1: :->owner' ) 30_arguments -C -s "$args[@]" '*:files:->files' && ret=0 31 32case $state in 33 owner) 34 if [[ $service = chgrp ]] || compset -P '*[:.]'; then 35 if (( EGID && $+commands[groups] )); then # except for root 36 _wanted groups expl 'group' compadd $(groups) && return 0 37 fi 38 _groups && ret=0 39 else 40 if compset -S '[.:]*'; then 41 suf=() 42 elif [[ $OSTYPE = irix* ]]; then 43 suf=( -qS '.' ) 44 else 45 suf=( -qS ':' ) 46 fi 47 _users "$suf[@]" && ret=0 48 fi 49 ;; 50 files) 51 (( $+opt_args[-h] || $+opt_args[--no-dereference] )) || deref="-" 52 if (( $+opt_args[--reference] )); then 53 zmodload -F zsh/stat b:zstat 2>/dev/null 54 usr=$(zstat +uid $opt_args[--reference]) 55 grp=$(zstat +gid $opt_args[--reference]) 56 _wanted files expl file _files -g "*($deref^u$usr,$deref^g$grp)" && ret=0 57 return ret 58 fi 59 if [[ $service = chgrp ]]; then 60 grp=${line[1]} 61 else 62 usr=${line[1]%%[.:]*} 63 usr=${${(M)usr:#[0-9]#}:-${userdirs[$usr]:+.$usr.}} 64 grp=${${(M)line[1]%%[.:]*}#?} 65 fi 66 [[ -n $grp ]] && grp="${${(M)grp:#[0-9]#}:-.$grp.}" 67 req=( ${usr:+\^u$usr} ${grp:+\^g$grp} ) 68 (( EUID )) && req=( u$EUID$^req ) 69 req=( $deref$^req ) 70 req="*(${(j:,:)req})" 71 72 ( : $~req ) 2> /dev/null || req='*' 73 74 _wanted files expl file _files -g "$req" && ret=0 75 ;; 76esac 77 78return ret 79