# bash completion for lintian(1) and lintian-info(1)       -*- shell-script -*-

_lintian_tags()
{
    local match search tags

    tags=$( awk '/^Tag/ { print $2 }' /usr/share/lintian/checks/*.desc )
    if [[ "$cur" == *, ]]; then
        search=${cur//,/ }
        for item in $search; do
            match=$( command grep -nE "^Tag: $item$" \
                /usr/share/lintian/checks/*.desc | cut -d: -f1 )
            tags=$( command sed -e "s/\<$item\>//g" <<<$tags )
        done
        COMPREPLY+=( $(compgen -W "$tags") )
    elif [[ "$cur" == *,* ]]; then
        COMPREPLY+=( $(compgen -P "${cur%,*}," -W "$tags" -- "${cur##*,}") )
    else
        COMPREPLY+=( $(compgen -W "$tags" -- "$cur") )
    fi
}

_lintian_checks()
{
    local match search todisable checks

    checks=$( awk '/^(Check-Script|Abbrev)/ { print $2 }' \
        /usr/share/lintian/checks/*.desc )
    if [[ "$cur" == *, ]]; then
        search=${cur//,/ }
        for item in $search; do
            match=$( command grep -nE "^(Check-Script|Abbrev): $item$" \
                /usr/share/lintian/checks/*.desc | cut -d: -f1 )
            todisable=$( awk '/^(Check-Script|Abbrev)/ { print $2 }' $match )
            for name in $todisable; do
                checks=$( command sed -e "s/\<$name\>//g" <<<$checks )
            done
        done
        COMPREPLY+=( $(compgen -W "$checks") )
    elif [[ "$cur" == *,* ]]; then
        COMPREPLY+=( $(compgen -P "${cur%,*}," -W "$checks" -- "${cur##*,}") )
    else
        COMPREPLY+=( $(compgen -W "$checks" -- "$cur") )
    fi
}

_lintian_infos()
{
    local match search infos

    infos=$( awk '/^Collector/ { print $2 }' \
        /usr/share/lintian/collection/*.desc )
    if [[ "$cur" == *, ]]; then
        search=${cur//,/ }
        for item in $search; do
            match=$( command grep -nE "^Collector: $item$" \
                /usr/share/lintian/collection/*.desc | cut -d: -f1 )
            infos=$( command sed -e "s/\<$item\>//g" <<<$infos )
        done
        COMPREPLY+=( $(compgen -W "$infos") )
    elif [[ "$cur" == *,* ]]; then
        COMPREPLY+=( $(compgen -P "${cur%,*}," -W "$infos" -- "${cur##*,}") )
    else
        COMPREPLY+=( $(compgen -W "$infos" -- "$cur") )
    fi
}

_lintian()
{
    local cur prev words cword
    _init_completion || return

    local action lint_actions general_opts behaviour_opts \
          configuration_opts selection_opts

    lint_actions="--setup-lab --remove-lab --check --check-part --tags
        --tags-from-file --ftp-master-rejects --dont-check-part --unpack
        --remove"
    general_opts="--help --version --print-version --verbose --debug --quiet"
    behaviour_opts="--info --display-info --display-experimental --pedantic
        --display-level --suppress-tags --suppress-tags-from-file --no-override
        --show-overrides --color --unpack-info --md5sums --checksums
        --allow-root --fail-on-warnings --keep-lab"
    configuration_opts="--cfg --lab --archivedir --dist --area --section --arch
        --root"
    selection_opts="--all --binary --source --udeb --packages-file"

    if [[ "$prev" == -* ]]; then
        case $prev in
            -C|--check-part|-X|--dont-check-part)
                _lintian_checks
                ;;
            -T|--tags|--suppress-tags)
                _lintian_tags
                ;;
            --tags-from-file|--suppress-tags-from-file|--cfg|-p|\
            --packages-file)
                _filedir
                ;;
            --lab|--archivedir|--dist|--root)
                _filedir -d
                ;;
            --color)
                COMPREPLY=($(compgen -W "never always auto html" -- "$cur"))
                ;;
            -U|--unpack-info)
                _lintian_infos
                ;;
            --area|--section)
                COMPREPLY=($(compgen -W "main contrib non-free" -- "$cur"))
                ;;
            --arch)
                ;;
        esac
    fi

    case "$cur" in
        --*)
            COMPREPLY=($(compgen -W "$lint_actions $general_opts
                $behaviour_opts $configuration_opts" -- "$cur"))
            ;;
        *,)
            # If we're here, the user is trying to complete on
            # --action tag,tag,<TAB>
            # Only few actions permit that, re-complete them now.
            case "$prev" in
                -C|--check-part|-X|--dont-check-part)
                    _lintian_checks
                    ;;
                -T|--tags|--suppress-tags)
                    _lintian_tags
                    ;;
                -U|--unpack-info)
                    _lintian_infos
                    ;;
            esac
            ;;
        *)
            _filedir '@(?(u)deb|changes|dsc)'
            ;;
    esac
    return 0
} &&
complete -F _lintian lintian

_lintian_info()
{
    local cur prev words cword
    _init_completion || return

    case "$prev" in
        -t|--tags)
            _lintian_tags
            return 0
            ;;
    esac

    case "$cur" in
        --*)
            COMPREPLY=($(compgen -W "--annotate --help --tags" -- "$cur"))
            ;;
        *)
            _filedir
            ;;
    esac
    return 0
} &&
complete -F _lintian_info lintian-info

# ex: filetype=sh
