#compdef update-alternatives

local curcontext="$curcontext" context state line expl ret alterdir
typeset -A opt_args

if [[ -d /var/lib/dpkg/alternatives ]];then
    alterdir=/var/lib/dpkg/alternatives
elif [[ -d /var/lib/rpm/alternatives/ ]];then
    alterdir=/var/lib/rpm/alternatives
fi

_arguments -C '--verbose' \
           '--quiet' \
           '--test' \
           '--help' \
           '--version' \
           '--altdir:altdir:_files -/' \
           '--admindir:admindir:_files -/' \
    '--install:*::alt:= ->install' \
    '--remove:*::alt:= ->remove' \
    '--auto:name:_files -W $alterdir' \
    '--display:name:_files -W $alterdir' \
    '--config:name:_files -W $alterdir' && return 0

while true; do
case "$state" in
	islave)
        _call_function ret _update_alternatives_$state && return ret
	state=
	_arguments -C '1:link:_files' \
                   '2:name:_files -W $alterdir' \
                   '3:path:_files' \
                   '--slave:*::more:= ->islave' && return 0
        [[ -z $state ]] && return 1
	;;

	install)
        _call_function ret _update_alternatives_$state && return ret
	_arguments -C '1:link:_files' \
                   '2:name:_files -W $alterdir' \
                   '3:path:_files' \
                   '4:priority:' \
                   '--slave:*::slave:= ->islave' && return 0
        [[ -z $state ]] && return 1
	;;

	remove)
        _call_function ret _update_alternatives_$state && return ret
	_arguments \
                   '1:name:_files -W $alterdir' \
                   '2:path:_files' && return 0
        return 1
	;;

	*)
	return 1
	;;

esac
done
