# bash completion for yum

# arguments:
#   1 = argument to "yum list" (all, available, updates etc)
#   2 = current word to be completed
_yum_list()
{
    if [ "$1" = all ] ; then
        # Try to strip in between headings like "Available Packages" - would
        # be nice if e.g. -d 0 did that for us.  This will obviously only work
        # for English :P
        COMPREPLY=( "${COMPREPLY[@]}"
            $( ${yum:-yum} -d 0 -C list $1 "$2*" 2>/dev/null | \
                sed -ne '/^Available /d' -e '/^Installed /d' -e '/^Updated /d' \
                -e 's/[[:space:]].*//p' ) )
    else
        # Drop first line (e.g. "Updated Packages") - would be nice if e.g.
        # -d 0 did that for us.
        COMPREPLY=( "${COMPREPLY[@]}"
            $( ${yum:-yum} -d 0 -C list $1 "$2*" 2>/dev/null | \
                sed -ne 1d -e 's/[[:space:]].*//p' ) )
    fi
}

# arguments:
#   1 = argument to "yum repolist" (enabled, disabled etc)
#   2 = current word to be completed
_yum_repolist()
{
    # TODO: add -d 0 when http://yum.baseurl.org/ticket/29 is fixed
    #       (for now --noplugins is used to get rid of "Loaded plugins: ...")
    # Drop first ("repo id      repo name") and last ("repolist: ...") rows -
    # would be nice if e.g. -d 0 did that for us.
    COMPREPLY=( "${COMPREPLY[@]}"
        $( compgen -W "$( ${yum:-yum} --noplugins -C repolist $1 2>/dev/null | \
            sed -ne '/^repo\s\{1,\}id/d' -e '/^repolist:/d' \
            -e 's/[[:space:]].*//p' )" -- "$2" ) )
}

# arguments:
#   1 = argument to "yum grouplist" (usually empty (""), or hidden)
#   2 = current word to be completed
_yum_grouplist()
{
    local IFS=$'\n'
    # TODO: add -d 0 when http://yum.baseurl.org/ticket/29 is fixed
    COMPREPLY=( $( compgen -W "$( ${yum:-yum} -C grouplist $1 "$2*" \
        2>/dev/null | sed -ne 's/^[[:space:]]\{1,\}\(.\{1,\}\)/\1/p' )" \
        -- "$2" ) )
}

# arguments:
#   1 = 1 or 0 to list enabled or disabled plugins
#   2 = current word to be completed
_yum_plugins()
{
    local val
    [ $1 = 1 ] && val='\(1\|yes\|true\|on\)' || val='\(0\|no\|false\|off\)'
    COMPREPLY=( "${COMPREPLY[@]}"
        $( compgen -W '$( command grep -il "^\s*enabled\s*=\s*$val" \
            /etc/yum/pluginconf.d/*.conf 2>/dev/null \
            | sed -ne "s|^.*/\([^/]\{1,\}\)\.conf$|\1|p" )' -- "$2" ) )
}

# arguments:
#   1 = current word to be completed
_yum_binrpmfiles()
{
    COMPREPLY=( "${COMPREPLY[@]}"
        $( compgen -f -o plusdirs -X '!*.rpm' -- "$1" ) )
    COMPREPLY=( $( compgen -W '"${COMPREPLY[@]}"' -X '*.src.rpm' ) )
    COMPREPLY=( $( compgen -W '"${COMPREPLY[@]}"' -X '*.nosrc.rpm' ) )
}

_yum()
{
    COMPREPLY=()
    local yum=$1
    local cur
    type _get_cword &>/dev/null && cur=`_get_cword` || cur=$2
    local prev=$3
    local cmds=( check check-update clean deplist downgrade groupinfo
        groupinstall grouplist groupremove help history info install list
        localinstall localupdate makecache provides reinstall remove repolist resolvedep
        search shell update upgrade version distro-sync )

    local i c cmd
    for (( i=0; i < ${#COMP_WORDS[@]}-1; i++ )) ; do
        for c in ${cmds[@]} check-rpmdb erase groupupdate grouperase \
            whatprovides distribution-synchronization ; do
            [ ${COMP_WORDS[i]} = $c ] && cmd=$c && break
        done
        [ -z $cmd ] || break
    done

    case $cmd in

        check|check-rpmdb)
            COMPREPLY=( $( compgen -W 'dependencies duplicates all' \
                -- "$cur" ) )
            return 0
            ;;

        check-update|grouplist|makecache|provides|whatprovides|resolvedep|\
        search)
            return 0
            ;;

        clean)
            if [ "$prev" = clean ] ; then
                COMPREPLY=( $( compgen -W 'expire-cache packages headers
                    metadata cache dbcache all' -- "$cur" ) )
            fi
            return 0
            ;;

        deplist)
            if [[ "$cur" == */* ]] ; then
                _yum_binrpmfiles "$cur"
            else
                _yum_list all "$cur"
            fi
            return 0
            ;;

        downgrade|reinstall)
            if [[ "$cur" == */* ]] ; then
                _yum_binrpmfiles "$cur"
            else
                _yum_list installed "$cur"
            fi
            return 0
            ;;

        erase|remove|distro-sync|distribution-synchronization)
            _yum_list installed "$cur"
            return 0
            ;;

        group*)
            _yum_grouplist "" "$cur"
            return 0
            ;;

        help)
            if [ "$prev" = help ] ; then
                COMPREPLY=( $( compgen -W '${cmds[@]}' -- "$cur" ) )
            fi
            return 0
            ;;

        history)
            case $prev in
                history)
                    COMPREPLY=( $( compgen -W 'info list summary undo redo
                        new' -- "$cur" ) )
                    ;;
                undo|redo)
                    COMPREPLY=( $( compgen -W "last $( $yum -d 0 -C history \
                        2>/dev/null | \
                        sed -ne 's/^[[:space:]]*\([0-9]\{1,\}\).*/\1/p' )" \
                        -- "$cur" ) )
                    ;;
            esac
            return 0
            ;;

        info)
            _yum_list all "$cur"
            return 0
            ;;

        install)
            if [[ "$cur" == */* ]] ; then
                _yum_binrpmfiles "$cur"
            else
                _yum_list available "$cur"
            fi
            return 0
            ;;

        list)
            if [ "$prev" = list ] ; then
                COMPREPLY=( $( compgen -W 'all available updates installed
                    extras obsoletes recent' -- "$cur" ) )
            fi
            return 0
            ;;

        localinstall|localupdate)
            _yum_binrpmfiles "$cur"
            return 0
            ;;

        repolist)
            if [ "$prev" = repolist ] ; then
                COMPREPLY=( $( compgen -W 'all enabled disabled' -- "$cur" ) )
            fi
            return 0
            ;;

        shell)
            if [ "$prev" = shell ] ; then
                COMPREPLY=( $( compgen -f -o plusdirs -- "$cur" ) )
            fi
            return 0
            ;;

        update|upgrade)
            if [[ "$cur" == */* ]] ; then
                _yum_binrpmfiles "$cur"
            else
                _yum_list updates "$cur"
            fi
            return 0
            ;;
        version)
            if [ "$prev" = version ] ; then
                COMPREPLY=( $( compgen -W 'all installed available nogroups
                    grouplist groupinfo' -- "$cur" ) )
            fi
            return 0
            ;;
    esac

    local split=false
    type _split_longopt &>/dev/null && _split_longopt && split=true

    case $prev in

        -d|--debuglevel|-e|--errorlevel)
            COMPREPLY=( $( compgen -W '0 1 2 3 4 5 6 7 8 9 10' -- "$cur" ) )
            return 0
            ;;

        --rpmverbosity)
            COMPREPLY=( $( compgen -W 'info critical emergency error warn
                debug' -- "$cur" ) )
            return 0
            ;;

        -c|--config)
            COMPREPLY=( $( compgen -f -o plusdirs -X "!*.conf" -- "$cur" ) )
            return 0
            ;;

        --installroot|--downloaddir)
            COMPREPLY=( $( compgen -d -- "$cur" ) )
            return 0
            ;;

        --enablerepo)
            _yum_repolist disabled "$cur"
            return 0
            ;;

        --disablerepo)
            _yum_repolist enabled "$cur"
            return 0
            ;;

        --disableexcludes)
            _yum_repolist all "$cur"
            COMPREPLY=( $( compgen -W '${COMPREPLY[@]} all main' -- "$cur" ) )
            return 0
            ;;

        --enableplugin)
            _yum_plugins 0 "$cur"
            return 0
            ;;

        --disableplugin)
            _yum_plugins 1 "$cur"
            return 0
            ;;

        --color)
            COMPREPLY=( $( compgen -W 'always auto never' -- "$cur" ) )
            return 0
            ;;

        -R|--randomwait|-x|--exclude|-h|--help|--version|--releasever|--cve|\
        --bz|--advisory|--tmprepo|--verify-filenames|--setopt)
            return 0
            ;;

        --download-order)
            COMPREPLY=( $( compgen -W 'default smallestfirst largestfirst' \
                -- "$cur" ) )
            return 0
            ;;

        --override-protection)
            _yum_list installed "$cur"
            return 0
            ;;

        --verify-configuration-files)
            COMPREPLY=( $( compgen -W '1 0' -- "$cur" ) )
            return 0
            ;;
    esac

    $split && return 0

    COMPREPLY=( $( compgen -W '--help --tolerant --cacheonly --config
        --randomwait --debuglevel --showduplicates --errorlevel --rpmverbosity
        --quiet --verbose --assumeyes --version --installroot --enablerepo
        --disablerepo --exclude --disableexcludes --obsoletes --noplugins
        --nogpgcheck --disableplugin --enableplugin --skip-broken --color
        --releasever --setopt ${cmds[@]}' -- "$cur" ) )
} &&
complete -F _yum -o filenames yum yummain.py

# Local variables:
# mode: shell-script
# sh-basic-offset: 4
# sh-indent-comment: t
# indent-tabs-mode: nil
# End:
# ex: ts=4 sw=4 et filetype=sh
