# This function is required by _dpkg() and _dpkg-reconfigure()
have dpkg && {
have grep-status && {
_comp_dpkg_installed_packages()
{
    grep-status -P -e "^$1" -a -FStatus 'install ok installed' -n -s Package
}
} || {
_comp_dpkg_installed_packages()
{
    command grep -A 1 "Package: $1" /var/lib/dpkg/status | \
        command grep -B 1 -Ee "ok installed|half-installed|unpacked| \
            half-configured|config-files" \
            -Ee "^Essential: yes" | \
        command grep "Package: $1" | cut -d\  -f2
}
}

# Debian dpkg(8) completion
#
_dpkg()
{
    local cur prev i

    COMPREPLY=()
    _get_comp_words_by_ref cur prev
    i=$COMP_CWORD

    _expand || return 0

    _split_longopt

    # find the last option flag
    if [[ $cur != -* ]]; then
        while [[ $prev != -* && $i != 1 ]]; do
            i=$((i-1))
            prev=${COMP_WORDS[i-1]}
        done
    fi

    case $prev in
        -c|-i|-A|-I|-f|-e|-x|-X|-W|--install|--unpack|--record-avail| \
        --contents|--info|--fsys-tarfile|--field|--control|--extract| \
        --show)
            _filedir '?(u)deb'
            return 0
            ;;
        -b|--build)
            _filedir -d
            return 0
            ;;
        -s|-p|-l|--status|--print-avail|--list)
            COMPREPLY=( $( apt-cache pkgnames "$cur" 2>/dev/null ) )
            return 0
            ;;
        -S|--search)
            _filedir
            return 0
            ;;
        -r|-L|-P|--remove|--purge|--listfiles)
            COMPREPLY=( $( _comp_dpkg_installed_packages "$cur" ) )
            return 0
            ;;
        *)
            COMPREPLY=( $( compgen -W '-i --install --unpack -A --record-avail \
                --configure -r --remove -P --purge --get-selections \
                --set-selections --update-avail --merge-avail \
                --clear-avail  --command-fd --forget-old-unavail -s \
                --status -p --print-avail -L --listfiles -l --list \
                -S --search -C --audit --print-architecture \
                --print-gnu-build-architecture \
                --print-installation-architecture \
                --compare-versions --help --version --force-help \
                --force-all --force-auto-select --force-downgrade \
                --force-configure-any --force-hold --force-bad-path \
                --force-not-root --force-overwrite \
                --force-overwrite-diverted --force-bad-verify \
                --force-depends-version --force-depends \
                --force-confnew --force-confold --force-confdef \
                --force-confmiss --force-conflicts --force-architecture\
                --force-overwrite-dir --force-remove-reinstreq \
                --force-remove-essential -Dh \
                --debug=help --licence --admindir --root --instdir \
                -O --selected-only -E --skip-same-version \
                -G --refuse-downgrade -B --auto-deconfigure \
                --no-debsig --no-act -D --debug --status-fd \
                -b --build -I --info -f --field -c --contents \
                -x --extract -X --vextract --fsys-tarfile -e --control \
                --ignore-depends --abort-after' -- "$cur" ) )
            ;;
    esac


}
complete -F _dpkg dpkg dpkg-deb
}

# Debian GNU dpkg-reconfigure(8) completion
#
have dpkg-reconfigure &&
_dpkg_reconfigure()
{
    local cur prev opt

    COMPREPLY=()
    _get_comp_words_by_ref cur prev

    case $prev in
        -f|--frontend)
        opt=( $( printf '%s\n' /usr/share/perl5/Debconf/FrontEnd/* ) )
        opt=( ${opt[@]##*/} )
        opt=( ${opt[@]%.pm} )
        COMPREPLY=( $( compgen -W '${opt[@]}' -- "$cur" ) )
        return 0
        ;;
        -p|--priority)
        COMPREPLY=( $( compgen -W 'low medium high critical' -- "$cur" ) )
        return 0
        ;;
    esac

    if [[ "$cur" == -* ]]; then
        COMPREPLY=( $(compgen -W '--frontend --priority --all --unseen-only \
                      --help --showold --force --terse' -- "$cur" ) )
    else
        COMPREPLY=( $( _comp_dpkg_installed_packages "$cur" ) )
    fi
} &&
complete -F _dpkg_reconfigure -o default dpkg-reconfigure

# Debian dpkg-source completion
#
have dpkg-source &&
_dpkg_source()
{
    local cur prev options work i action packopts unpackopts fields

    packopts="-c -l -F -V -T -D -U -W -E -sa -i -I -sk -sr -ss -sA -sK -sP \
              -sU -sR"
    unpackopts="-sp -sn -su"
    options="-x -b $packopts $unpackopts"
    fields="Format Source Version Binary Maintainer Uploader Architecture \
            Standards-Version Build-Depends Files"

    COMPREPLY=()
    _get_comp_words_by_ref cur prev

    action="options"
    for (( i=0; i < ${#COMP_WORDS[@]}-1; i++ )); do
        if [[ ${COMP_WORDS[$i]} == "-x" ]]; then
            action=unpack
        elif [[ ${COMP_WORDS[$i]} == "-b" ]]; then
            action=pack
        elif [[ ${COMP_WORDS[$i]} == "-h" ]]; then
            action=help
        fi
    done

    case $action in
        unpack)
            case $prev in
                -x)
                    _filedir -d
                    _filedir 'dsc'
                    return 0
                    ;;
                *)
                    COMPREPLY=( $( compgen -W "$unpackopts" -- "$cur" ) )
                    _filedir -d
                    _filedir
                    return 0
                    ;;
            esac
            return 0
            ;;
        pack)
            case $prev in
                -b)
                    _filedir -d
                    return 0
                    ;;
                -c|-l|-T|-i|-I)
                    # -c: get controlfile
                    # -l: get per-version info from this file
                    # -T: read variables here, not debian/substvars
                    # -i: <regexp> filter out files to ignore diffs of.
                    # -I: filter out files when building tarballs.
                    # return directory names and file names
                    _filedir -d
                    _filedir
                    return 0
                    ;;
                -F)
                    # -F: force change log format
                    COMPREPLY=( $( command ls /usr/lib/dpkg/parsechangelog ) )
                    return 0
                    ;;
                -V|-D)
                    # -V: set a substitution variable
                    # we don't know anything about possible variables or values
                    # so we don't try to suggest any completion.
                    COMPREPLY=()
                    return 0
                    ;;
                -D)
                    # -D: override or add a .dsc field and value
                    # if $cur doesn't contain a = yet, suggest variable names
                    if [[ "$cur" == *=* ]]; then
                        # $cur contains a "="
                        COMPREPLY=()
                        return 0
                    else
                        COMPREPLY=( $( compgen -W "$fields" -- "$cur" ) )
                        return 0
                    fi
                    ;;
                -U)
                    # -U: remove a field
                    # Suggest possible fieldnames
                    COMPREPLY=( $( compgen -W "$fields" -- "$cur" ) )
                    return 0
                    ;;
                *)
                    COMPREPLY=( $( compgen -W "$packopts $unpackopts" -- "$cur" ) )
                    return 0
                    ;;
            esac
            return 0
            ;;
        *)
            COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
            return 0
            ;;
    esac
} &&
complete -F _dpkg_source dpkg-source

# 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
