# bash completion for xm

have xm && {
_xen_domain_names()
{
    COMPREPLY=( $(compgen -W "$( xm list 2>/dev/null | \
        awk '!/Name|Domain-0/ { print $1 }'  )" -- "$cur") )
}

_xen_domain_ids()
{
    COMPREPLY=( $(compgen -W "$( xm list 2>/dev/null | \
        awk '!/Name|Domain-0/ { print $2 }' )" -- "$cur") )
}

_xm()
{
    # TODO: _split_longopt

    local cur prev command options

    COMPREPLY=()
    cur=`_get_cword`

    commands='console create new delete destroy domid domname dump-core \
        list mem-max mem-set migrate pause reboot rename restore \
        resume save shutdown start suspend sysrq trigger top unpause \
        uptime vcpu-list vcpu-pin vcpu-set debug-keys dmesg info log \
        serve sched-credit sched-sedf block-attach block-detach \
        block-list network-attach network-detach network-list \
        vtpm-list vnet-list vnet-create vnet-delete labels addlabel \
        rmlabel getlabel dry-run resources makepolicy loadpolicy \
        cfgbootpolicy dumppolicy help'

    if [[ $COMP_CWORD -eq 1 ]] ; then
        COMPREPLY=( $( compgen -W "$commands" -- "$cur" ) )
    else
        prev=${COMP_WORDS[COMP_CWORD-1]}
        if [[ "$cur" == *=* ]]; then
            prev=${cur/=*/}
            cur=${cur/*=/}
        fi

        command=${COMP_WORDS[1]}
        if [[ "$cur" == -* ]]; then
            # possible options for the command
            case $command in
                create)
                    options='-c'
                    ;;
                dmesg)
                    options='--clear'
                    ;;
                list)
                    options='--long'
                    ;;
                reboot)
                    options='-w -a'
                    ;;
                shutdown)
                    options='-w -a -R -H'
                    ;;
                sched-credit)
                    options='-d -w -c'
                    ;;
                @(block|network|vtpm|vnet)-list)
                    options='-l --long'
                    ;;
                getpolicy)
                    options='--dumpxml'
                    ;;
                new)
                    options='-h --help --help_config -q \
                        --quiet --path= -f= \
                        --defconfig= -F= --config= \
                        -b --dryrun -x --xmldryrun \
                        -s --skipdtd -p --paused -c \
                        --console_autoconnect'
                    ;;
            esac
            COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
        else
            case $command in
                @(console|destroy|domname|domid|list|mem-@(set|max)|pause|reboot|rename|shutdown|unpause|vcpu-@(list|pin|set)|block-list|network-list|vtpm-list))
                    _count_args
                    case $args in
                        2)
                            _xen_domain_names
                            ;;
                    esac
                    ;;
                migrate)
                    _count_args
                        case $args in
                        2)
                            _xen_domain_names
                            ;;
                        3)
                            _known_hosts_real "$cur"
                            ;;
                    esac
                    ;;
                @(restore|dry-run|vnet-create))
                    _filedir
                    ;;
                save)
                    _count_args
                    case $args in
                        2)
                            _xen_domain_names
                            ;;
                        3)
                            _filedir
                            ;;
                    esac
                    ;;
                sysrq)
                    _count_args
                    case $args in
                        2)
                            _xen_domain_names
                            ;;
                        3)
                            COMPREPLY=( $(compgen -W "r s e i u b" -- "$cur") )
                            ;;
                    esac
                    ;;
                block-attach)
                    _count_args
                    case $args in
                        2)
                            _xen_domain_names
                            ;;
                        3)
                            COMPREPLY=( $(compgen -W "phy: file:" -- "$cur") )
                            ;;
                        5)
                            COMPREPLY=( $(compgen -W "w r" -- "$cur") )
                            ;;
                        6)
                            _xen_domain_names
                            ;;
                    esac
                    ;;
                block-detach)
                    _count_args
                    case $args in
                        2)
                            _xen_domain_names
                            ;;
                        3)
                            COMPREPLY=( $(compgen -W "$( xm block-list $prev \
                                2>/dev/null | awk '!/Vdev/ { print $1 }' )" \
                                -- "$cur") )
                            ;;
                    esac
                    ;;
                network-attach)
                    _count_args
                    case $args in
                        2)
                            _xen_domain_names
                            ;;
                        *)
                            COMPREPLY=( $(compgen -W "script= ip= mac= \
                                bridge= backend=" -- "$cur") )
                            ;;
                    esac
                    ;;
                network-detach)
                    _count_args
                    case $args in
                        2)
                            _xen_domain_names
                            ;;
                        3)
                            COMPREPLY=( $(compgen -W "$( xm network-list $prev \
                                2>/dev/null | awk '!/Idx/ { print $1 }' )" \
                                -- "$cur") )
                            ;;
                    esac
                    ;;
                sched-credit)
                    case $prev in
                        -d)
                            _xen_domain_names
                            return 0
                            ;;
                    esac
                    ;;
                create)
                    _filedir
                    COMPREPLY=( ${COMPREPLY[@]:-} \
                        $( compgen -W '$( command ls /etc/xen 2>/dev/null )' \
                        -- "$cur" ) )
                    ;;
                new)
                    case $prev in
                        -@(f|F|-defconfig|-config))
                            _filedir
                            return 0
                            ;;
                        --path)
                            _filedir -d
                            return 0
                            ;;
                    esac

                    _count_args
                        case $args in
                        2)
                            _xen_domain_names
                            ;;
                    esac
                    ;;
            esac
        fi
    fi

    return 0
}
complete -F _xm xm
}

# 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
