# 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 lint_actions general_opts behaviour_opts configuration_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"

    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
            ;;
        *)
            # in Ubuntu, dbgsym packages end in .ddeb, lintian >= 2.57.0 groks
            _filedir '@(?(u|d)deb|changes|dsc|buildinfo)'
            ;;
    esac
    return 0
} &&
    complete -F _lintian lintian

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

    case "$prev" in
        --help | --profile)
            return
            ;;
        -t | --tags)
            _lintian_tags
            return
            ;;
        --include-dir)
            _filedir -d
            return
            ;;
    esac

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

# ex: filetype=sh
