[Yum-devel] [PATCH] Add bash completion.

Tim Lauridsen tim.lauridsen at googlemail.com
Fri Oct 23 12:15:43 UTC 2009


On 10/23/2009 01:26 PM, Ville Skyttä wrote:
> Should work with bash>= 3; does not require bash-completion but uses
> a few functions from it if available.
> ---
>   etc/Makefile |    3 +-
>   etc/yum.bash |  277 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>   yum.spec     |    1 +
>   3 files changed, 280 insertions(+), 1 deletions(-)
>   create mode 100644 etc/yum.bash
>
> diff --git a/etc/Makefile b/etc/Makefile
> index 7a083f7..68dd3c2 100644
> --- a/etc/Makefile
> +++ b/etc/Makefile
> @@ -25,4 +25,5 @@ install:
>
>   	install -m 755 yum-updatesd.conf $(DESTDIR)/etc/yum/yum-updatesd.conf
>
> -
> +	mkdir -p $(DESTDIR)/etc/bash_completion.d
> +	install -m 644 yum.bash $(DESTDIR)/etc/bash_completion.d
> diff --git a/etc/yum.bash b/etc/yum.bash
> new file mode 100644
> index 0000000..1080fac
> --- /dev/null
> +++ b/etc/yum.bash
> @@ -0,0 +1,277 @@
> +# 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\|Installed\|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\+id\|list:\)/d' -e 's/[[:space:]].*//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|^.*/\([^/]\+\)\.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-update clean deplist downgrade groupinfo groupinstall
> +        grouplist groupremove help history info install list localinstall
> +        makecache provides reinstall remove repolist resolvedep search shell
> +        update upgrade version )
> +
> +    local i c cmd
> +    for (( i=0; i<  ${#COMP_WORDS[@]}-1; i++ )) ; do
> +        for c in ${cmds[@]} erase groupupdate grouperase whatprovides ; do
> +            [ ${COMP_WORDS[i]} = $c ]&&  cmd=$c&&  break
> +        done
> +        [ -z $cmd ] || break
> +    done
> +
> +    case $cmd in
> +
> +        check-update|grouplist|makecache|provides|whatprovides|resolvedep|\
> +        search|version)
> +            return 0
> +            ;;
> +
> +        clean)
> +            if [ "$prev" = clean ] ; then
> +                COMPREPLY=( $( compgen -W '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)
> +            _yum_list installed "$cur"
> +            return 0
> +            ;;
> +
> +        group*)
> +            local IFS=$'\n'
> +            # TODO: add -d 0 when http://yum.baseurl.org/ticket/29 is fixed
> +            # TODO: add -C when http://yum.baseurl.org/ticket/310 is fixed
> +            COMPREPLY=( $( compgen -W "$( $yum -C grouplist 2>/dev/null | \
> +                sed -ne 's/^[[:space:]]\+\(.\+\)/\1/p' )" -- "$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 "$( $yum -d 0 -C history \
> +                        2>/dev/null | \
> +                        sed -ne 's/^[[:space:]]*\([0-9]\+\).*/\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
> +            ;;
> +    esac
> +
> +    local split=false
> +    type _split_longopt&>/dev/null&&  _split_longopt&&  split=true
> +
> +    case $prev in
> +
> +        -d|-e)
> +            COMPREPLY=( $( compgen -W '0 1 2 3 4 5 6 7 8 9 10' -- "$cur" ) )
> +            return 0
> +            ;;
> +
> +        -c)
> +            COMPREPLY=( $( compgen -f -o plusdirs -X "!*.conf" -- "$cur" ) )
> +            return 0
> +            ;;
> +
> +        --installroot)
> +            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|-x|--exclude|-h|--help|--version)
> +            return 0
> +            ;;
> +    esac
> +
> +    $split&&  return 0
> +
> +    COMPREPLY=( $( compgen -W '--help --tolerant -C -c -R -d
> +        --showduplicates -e --quiet --verbose -y --version --installroot
> +        --enablerepo --disablerepo --exclude --disableexcludes --obsoletes
> +        --noplugins --nogpgcheck --disableplugin --enableplugin
> +        --skip-broken --color ${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
> diff --git a/yum.spec b/yum.spec
> index a72509c..8a9fc6a 100644
> --- a/yum.spec
> +++ b/yum.spec
> @@ -82,6 +82,7 @@ exit 0
>   %dir %{_sysconfdir}/%{name}
>   %dir %{_sysconfdir}/yum/repos.d
>   %config %{_sysconfdir}/logrotate.d/%{name}
> +%{_sysconfdir}/bash_completion.d
>   %{_datadir}/yum-cli/*
>   %exclude %{_datadir}/yum-cli/yumupd.py*
>   %{_bindir}/yum

Looks fine to me

Tim


More information about the Yum-devel mailing list