view bin/check-ports @ 63:0ae7697702b3

Handling of mapped packages is basically implemented. A workaround for the bug below is needed. BUGS: "pkg rquery -I" does **not** query the port's package INDEX file. It queries only the repository databases. NOTE: "pkg version -I" works correctly and opens the port's package INDEX file.
author Franz Glasner <hg@dom66.de>
date Thu, 21 Mar 2019 12:34:47 +0100
parents 6c8ee1ef9ef2
children ffd5f575edd5
line wrap: on
line source

#!/bin/sh
#
# $HGsource$
# $Revision$ $Date$ $Author$
#
# $HGpath$
#

VERSION=@@VERSION@@

#
# Configuration directory
#
: ${CONFIGDIR:=/usr/local/etc/local-bsdtools}

#
# Mapping configuration: installed package name -> original package name
# Note: This is independent of any repo
#
: ${PACKAGE_MAPPING:=${CONFIGDIR}/package-mapping.conf}

#
# Local repository with non-public packages and/or ports with changed
# OPTIONS (i.e. not using the defaults) or forks of official packages with
# other package names
#
: ${LOCAL_REPO:=LocalRepo}

#
# Local repository with ports with default OPTIONS (i.e. unchanged)
# but newer than the packages in the "FreeBSD" repository.
# Some sort of a fast-track repository.
#
: ${LOCALBSDPORTS_REPO:=LocalBSDPorts}

#
# The official FreeBSD binary repository
#
: ${FREEBSD_REPO:=FreeBSD}

#
# Directly installed from ports
#
: ${PORTS_DIRECT_INSTALLED_REPO:=unknown-repository}

get_remote_repo_versions() {
    local _repo _data _rv

    _repo=$1

    _data=$(pkg version -U -R -r ${_repo} -v)
    _rv=$?
    eval remote_versions_${_repo}=\"\${_data}\"
    return ${_rv}
}

get_remote_repo_data() {
    local _repo _name _rversions _rfqp _rl _rdescr

    _repo=$1
    _name=$2

    eval _rversions=\"\${remote_versions_${_repo}}\"
    while read _rfqp _rl _rdescr ; do
        if [ ${_rfqp%-*} = ${_name} ] ; then
            eval remote_label_${_repo}=\"\${_rl}\"
            eval remote_descr_${_repo}=\"\${_rdescr}\"
            return 0
        fi
    done <<EOF884657
${_rversions}
EOF884657
    eval remote_label_${_repo}=""
    eval remote_descr_${_repo}=""
    return 1
}

get_local_index_versions() {
    local_index_versions=$(pkg version -I -v)
}

get_repo_for_installed_package() {
    local _name _n _v _r

    _name=$1

    while read _n _v _r ; do
        if [ ${_name} = ${_n} ] ; then
            repository=${_r}
            return 0
        fi
    done <<EOF223777
${installed_data}
EOF223777
    return 1
}

get_immediate_index_version() {
    local _name _val _rv

    _name=$1

    _val=$(pkg rquery -I "${_name}" | cut -f 1 -d '|')
    _rv=$?
    immediate_index_version=${_val##*-}
    return ${_rv}
}

get_immediate_remote_repo_version() {
    local _repo _name _version _rv

    _repo=$1
    _name=$2

    _version=$(pkg rquery -U -r "${_repo}" '%v' "${_name}")
    _rv=$?
    eval immediate_remote_repo_version_${_repo}=\"\${_version}\"
    return ${_rv}
}

assert_local_version() {
    local _name _version _n _v _r

    _name=$1
    _version=$2

    while read _n _v _r ; do
        if [ ${_name} = ${_n} ] ; then
            if [ ${_version} != ${_v} ] ; then
                return 1
            else
                return 0
            fi
        fi
    done <<EOF223
${installed_data}
EOF223
    return 2
}

get_mapping() {
    local _package _n _mapped

    _package=$1

    if [ -r "${PACKAGE_MAPPING}" ] ; then
        while read _n _mapped ; do
            if [ "${_n}" = "${_package}" ] ; then
                mapped_package_name="${_mapped}"
                return 0
            fi
        done < ${PACKAGE_MAPPING}
    fi
    mapped_package_name=""
    return 1
}

print_title() {
    local _package _repo

    _package=$1
    _repo=$2
    if [ -z "${title_printed}" ] ; then
        echo "${_package}    (${_repo})"
        title_printed=yes
    fi
}


alldata_flag=""
alldata_flag_LocalBSDPorts=""
alldata_flag_LocalRepo=""
short_flag=""
verbose_flag=""

while getopts "Aasv" _opt ; do
    case ${_opt} in
        A)
            # print for every package the status of all repositories
            alldata_flag=1
            alldata_flag_LocalBSDPorts=1
            alldata_flag_LocalRepo=1
            ;;
        a)
            # print the data of all repos that have the package
            alldata_flag=1
            ;;
        s)
            # "short" output: if installed from FreeBSD repo: don't
            # report if only the index is newer
            short_flag=1
            ;;
        v)
            # print all titles and repo of every installed always
            verbose_flag=1
            ;;
        \?)
            exit 2
            ;;
        *)
            echo "option handling failed" >&2
            exit 2
            ;;
    esac
done

if [ -n "${short_flag}" -a -n "${alldata_flag}" ]; then
    echo "the -s option cannot be combined with -A or -a" >&2
    exit 2
fi

installed_packages=$(pkg query '%n')
installed_data="$(pkg query '%n %v %R' $installed_packages)"

get_remote_repo_versions ${LOCAL_REPO}
get_remote_repo_versions ${LOCALBSDPORTS_REPO}
get_remote_repo_versions ${FREEBSD_REPO}
get_local_index_versions

while read lfqp llabel ldescr ; do
    _installed_name=${lfqp%-*}
    _installed_version=${lfqp##*-}
    title_printed=""
    get_repo_for_installed_package ${_installed_name}
    get_mapping ${_installed_name}
    if [ -n "${verbose_flag}" ] ; then
        print_title "${lfqp}" "${repository}"
    fi
    if ! assert_local_version ${_installed_name} ${_installed_version} ; then
        echo "Assertion failed: $lfqp ${_installed_name} ${_installed_version} ${llabel}" >&2
        exit 1
    fi
    get_remote_repo_data ${LOCAL_REPO} ${_installed_name}
    get_remote_repo_data ${LOCALBSDPORTS_REPO} ${_installed_name}
    get_remote_repo_data ${FREEBSD_REPO} ${_installed_name}
    _print_detail=""
    if [ -n "${mapped_package_name}" ] ; then
        _print_detail=1
    fi
    if [ \( -n "${alldata_flag}" \) ]; then
        _print_detail=1
    else
        if [ -n "${short_flag}" ]; then
            #
            # NOTE: -s and -A/-a are incompatible: so "alldata_XXX" needs not
            #       to be checked!
            #
            case "${repository}" in
                "${FREEBSD_REPO}")
                    if [ \( "${llabel}" != '<' -a "${llabel}" != '=' \) -o "${remote_label_FreeBSD}" != '=' -o "${remote_label_LocalRepo}" != '?' -o "${remote_label_LocalBSDPorts}" != '?' ]; then
                        _print_detail=1
                    fi
                    ;;
                "${LOCAL_REPO}")
                    _print_detail=1
                    ;;
                "${LOCALBSDPORTS_REPO}")
                    if [ "${llabel}" != '=' -o "${remote_label_FreeBSD}" != '>' -o "${remote_label_LocalRepo}" != '?' -o "${remote_label_LocalBSDPorts}" = '?' -o "${remote_label_LocalBSDPorts}" = '<' ]; then
                        _print_detail=1
                    fi
                    ;;
                "${PORTS_DIRECT_INSTALLED_REPO}")
                    _print_detail=1
                    ;;
                *)
                    echo "ERROR: unhandled repository: ${repository}" >&2
                    exit 1
                    ;;
            esac
        else
            if [ \( \( "${llabel}" != '?' -a "${llabel}" != '=' \) -o \( "${remote_label_FreeBSD}" != '?' -a "${remote_label_FreeBSD}" != '=' \) -o \( "${remote_label_LocalBSDPorts}" != '?' -a "${remote_label_LocalBSDPorts}" != '=' \) -o \( "${remote_label_LocalRepo}" != '?' -a "${remote_label_LocalRepo}" != '=' \) \) -o \( "${repository}" = "${PORTS_DIRECT_INSTALLED_REPO}" \) ]; then
                _print_detail=1
            fi
        fi
    fi
    if [ -n "${_print_detail}" ]; then
        print_title "${lfqp}" "${repository}"
        echo "   INDEX        : ${llabel} ${ldescr}"
        echo "   FreeBSD      : ${remote_label_FreeBSD} ${remote_descr_FreeBSD}"
        if [ \( -n "${alldata_flag_LocalBSDPorts}" \) -o \( "${remote_label_LocalBSDPorts}" != '?' \) ] ; then
            echo "   LocalBSDPorts: ${remote_label_LocalBSDPorts} ${remote_descr_LocalBSDPorts}"
        fi
        if [ \( -n "${alldata_flag_LocalRepo}" \) -o \( "${remote_label_LocalRepo}" != '?' \) ] ; then
            echo "   LocalRepo    : ${remote_label_LocalRepo} ${remote_descr_LocalRepo}"
        fi
        if [ -n "${mapped_package_name}" ] ; then
	    echo "   ---> ${mapped_package_name}"
            get_immediate_index_version "${mapped_package_name}"
	    get_immediate_remote_repo_version ${LOCAL_REPO} ${mapped_package_name}
            get_immediate_remote_repo_version ${LOCALBSDPORTS_REPO} ${mapped_package_name}
            get_immediate_remote_repo_version ${FREEBSD_REPO} ${mapped_package_name}
            echo "      INDEX        : ${immediate_index_version}"
            echo "      FreeBSD      : ${immediate_remote_repo_version_FreeBSD}"
	    echo "      LocalBSDPorts: ${immediate_remote_repo_version_LocalBSDPorts}"
	    echo "      LocalRepo    : ${immediate_remote_repo_version_LocalRepo}"
        fi
    fi
done <<EOF856661111299999
${local_index_versions}
EOF856661111299999