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" \
            -Ee "^Essential: yes" | \
        command grep "Package: $1" | cut -d\  -f2
}
}

have grep-status && {
_comp_dpkg_hold_packages()
{
    grep-status -P -e "^$1" -a -FStatus 'hold' -n -s Package
}
} || {
_comp_dpkg_hold_packages()
{
    command grep -B 2 'hold' /var/lib/dpkg/status | \
        command grep "Package: $1" | cut -d\  -f2
}
}

have wajig &&
_wajig()
{
    local cur dashoptions prev special i

    COMPREPLY=()
    _get_comp_words_by_ref cur prev

    dashoptions='-h --help -V --version'

    for (( i=0; i < ${#COMP_WORDS[@]}-1; i++ )); do
        if [[ ${COMP_WORDS[i]} == \
         @(addcdrom|addrepo|autoalts|autoclean|autodownload|autoremove|build|
         builddeps|changelog|clean|contents|dailyupgrade|dependents|describe|
         describenew|details|distupgrade|download|editsources|extract|
         fixconfigure|fixinstall|fixmissing|force|hold|info|init|install|
         installsuggested|integrity|large|lastupdate|listalternatives|
         listcache|listcommands|listdaemons|listfiles|listhold|listinstalled|
         listnames|listpackages|listscripts|listsection|listsections|
         liststatus|madison|move|new|newdetail|news|newupgrades|nonfree|
         orphans|policy|purge|purgeorphans|purgeremoved|rbuilddeps|readme|
         recdownload|recommended|reconfigure|reinstall|reload|remove|
         removeorphans|repackage|reportbug|restart|rpm2deb|rpminstall|
         search|searchapt|show|sizes|snapshot|source|start|status|statusmatch|
         stop|syslog|tasksel|todo|toupgrade|tutorial|unhold|unofficial|
         update|updatealternatives|updatepciids|updateusbids|upgrade|
         upgradesecurity|verify|versions|whichpackage) ]];
         then special=${COMP_WORDS[i]}
        fi
    done

    if [[ -n "$special" ]]; then
       case $special in
           install|distupgrade|download|show|changelog|builddeps|dependents|describe|details|policy|recdownload)
               COMPREPLY=( $( apt-cache pkgnames $cur 2> /dev/null ) )
               if [[ "$special" == "install" ]]; then
                   _filedir
               fi
               return 0
               ;;
           purge|remove|reinstall|listinstalled|hold|news|readme|recommended|reconfigure|reload|repackage|*start|status|stop|todo|verify)
               COMPREPLY=( $( _comp_dpkg_installed_packages "$cur" ) )
               return 0
               ;;
           unhold)
               COMPREPLY=( $( _comp_dpkg_hold_packages "$cur" ) )
               return 0
               ;;
           contents|extract|info|rpm2deb|rpminstall)
               _filedir
               ;;
       esac
    fi

    case $prev in
        # don't complete anything if these options are found
        autoclean|clean|search|upgrade|update)
            return 0
            ;;
        -S)
            _filedir
            return 0
            ;;
    esac

    if [[ "$cur" == -* ]]; then
        COMPREPLY=( $( compgen -W "$dashoptions" -- "$cur" ) )
    elif [[ -z "$special" ]]; then
        commands=(addcdrom addrepo autoalts autoclean autodownload autoremove
            build builddeps changelog clean contents dailyupgrade dependents
            describe describenew details distupgrade download editsources
            extract fixconfigure fixinstall fixmissing force hold info init
            install installsuggested integrity large lastupdate
            listalternatives listcache listcommands listdaemons listfiles
            listhold listinstalled listnames listpackages listscripts
            listsection listsections liststatus
            madison move new newdetail news newupgrades nonfree orphans
            policy purge purgeorphans purgeremoved rbuilddeps readme
            recdownload recommended reconfigure reinstall reload remove
            removeorphans repackage reportbug restart rpm2deb rpminstall
            search searchapt show sizes snapshot source start status
            statusmatch stop syslog tasksel todo toupgrade tutorial unhold
            unofficial update updatealternatives updatepciids updateusbids
            upgrade upgradesecurity verify versions whichpackage)

        local option oldNoCaseMatch=$(shopt -p nocasematch)
        shopt -s nocasematch
        COMPREPLY=( $( for command in "${commands[@]}"; do
                [[ ${command:0:${#cur}} == "$cur" ]] && printf '%s\n' $command
                done ) )
        eval "$oldNoCaseMatch" 2> /dev/null
    fi

    return 0
}
complete -F _wajig wajig

# 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
