Hi,

I am looking for a way to show a package's dependencies. The output
might look similar to how -R looks in pkg_info(1), e.g.:

    Information for inst:python-3.7.4

    Directly depends on:
    bzip2-1.0.8
    gettext-runtime-0.20.1p0
    libffi-3.2.1p5
    sqlite3-3.29.0
    xz-5.2.4

    Transitively depends on:
    libiconv-1.16p0

Does such a command such as this already exist? I guessed that the
pkg_* tools would have this covered but I was not able to find it
in the manpages.

In making the above example, I created a proof of concept shell
script that demonstrates the desired behaviour. It has limitations
on what package names it can accept, it only works locally and
probably has numerous other problems :). It is inlined below.

--
Chris Rawnsley


#!/bin/sh

bin=$(basename "$0")

usage() {
        cat <<EOF
usage: ${bin} pkg-name
EOF
}

PKG_DBDIR=${PKG_DBDIR:-/var/db/pkg}
direct_deps=$(mktemp -t "${bin}.direct_deps.XXXXXX")
temp_deps=$(mktemp -t "${bin}.temp_deps.XXXXXX")
all_deps=$(mktemp -t "${bin}.all_deps.XXXXXX")

cleanup() {
        rm -f "${direct_deps}" "${temp_deps}" "${all_deps}"
}
trap cleanup INT TERM QUIT

if ! touch "${direct_deps}" "${temp_deps}" "${all_deps}" 2>/dev/null; then
        printf '%s\n' "${bin}: Unable to make temporary files:"
        cleanup; exit 1
fi

# Does not account for categories, variants or versions...
pkg_unresolved=$1
pkg_dir=$(find "${PKG_DBDIR}" -type d -iname "${pkg_unresolved}-*" -print | 
head -1)

if [ -z "${pkg_dir}" ]; then
        printf '%s\n' "${bin}: unable to find package"
        cleanup; exit 1
fi

pkg=$(basename "${pkg_dir}")

pkg_requiring="${pkg_dir}/+REQUIRING"
if [ -s "${pkg_requiring}" ]; then
        sort "${pkg_requiring}" | tee "${temp_deps}" >"${direct_deps}"
fi

while deps=$(comm -23 "${temp_deps}" "${all_deps}" | grep .); do
        printf '%s\n' ${deps} >>"${all_deps}"
        for d in ${deps}; do
                cat "${PKG_DBDIR}/$d/+REQUIRING" >>"${temp_deps}" 2>/dev/null
        done
        sort -uo "${all_deps}" "${all_deps}"
        sort -uo "${temp_deps}" "${temp_deps}"
done

printf 'Information for inst:%s\n\n' "${pkg}"

printf 'Directly depends on:\n'
printf '%s\n' $(cat ${direct_deps})

printf '\n'

printf 'Transitively depends on:\n'
        
printf '%s\n' $(comm -23 "${all_deps}" "${direct_deps}")

cleanup

Reply via email to