#!/bin/sh -e # Display packages which depend on the given package ## SYNOPSIS: ## .Nm ## .Op Fl tm ## .Op Ar package ## DESCRIPTION: ## .Nm ## generates reverse dependencies for ## .Ar package . ## If no package name is given, ## .Nm ## uses the name of the current directory for the package. ## ## Following options are available for use:: ## .Bl -tag ## .It Fl t , -tree ## Also print indirect reverse dependencies ## .It Fl m , -make ## Include make dependencies ## .El parser_definition() { setup REST help:usage -- "usage: ${0##*/} [options...] [pkg]" flag tree -t --tree -- "Also print indirect reverse dependencies" flag make -m --make -- "Include make dependencies" global_options } # shellcheck disable=1091 . cpt-lib; set +f [ "$1" ] || set -- "${PWD##*/}" # 'cd' to the database directory as a simple way of # stripping the path and performing a 'basename'. # # $sys_db is defined on cpt-lib # shellcheck disable=2154 cd "$sys_db" get_revdep() { pkg=$1; set -- "^$pkg\$" # Defined by parser. # shellcheck disable=2154 [ "$make" ] && set -- -e "$1" -e "^$pkg " grep "$@" -- */depends | while read -r pkg _; do printf '%s\n' "${pkg%%/*}" done } # Defined by parser. # shellcheck disable=2154 if [ "$tree" ]; then mkdir -p "$tmp_dir" :> "$tmp_dir/processed" get_revdep "$1" > "$tmp_dir/dep" while ! diff -q "$tmp_dir/dep" "$tmp_dir/processed" >/dev/null 2>&1; do cp "$tmp_dir/dep" "$tmp_dir/dep.new" while read -r line; do grep -q "^$line\$" "$tmp_dir/processed" && continue get_revdep "$line" >> "$tmp_dir/dep.new" printf '%s\n' "$line" >> "$tmp_dir/processed" done < "$tmp_dir/dep" sort -u -o "$tmp_dir/dep" "$tmp_dir/dep.new" sort -u -o "$tmp_dir/processed" "$tmp_dir/processed" done cat "$tmp_dir/dep" else get_revdep "$1" fi