#!/bin/sh
# TazPkg - Tiny autonomous zone packages manager, hg.slitaz.org/tazpkg
# depends - TazPkg module
# Show packages dependencies and reverse dependencies trees

. /lib/libtaz.sh
. /usr/libexec/tazpkg/getenv
dep_scan() {
for i in $1; do
case " $ALL_DEPS " in
*\ $i\ *) continue;;
esac
ALL_DEPS="$ALL_DEPS $i"
if [ -z "$mark" ]; then
ii="$i"
else
ii="- $i"; grep -q ^$i$'\t' "$PKGS_DB/installed.info" && ii="+ $i"
fi
[ -n "$2" ] && echo "$2$ii ($(awk -F$'\t' -vp="$i" '
$1==p{split($7,s," ");print s[2]}' "$PKGS_DB/packages.info"))"
DEPENDS="$(awk -F$'\t' -vp="$i" '$1==p{print $8 " "}' "$PKGS_DB/installed.info")"
[ -z "$DEPENDS" ] && \
DEPENDS="$(awk -F$'\t' -vp="$i" '$1==p{print $8 " "}' "$PKGS_DB/packages.info")"
[ -n "$DEPENDS" ] && dep_scan "$DEPENDS" "$2  "
done
}
rdep_scan() {
SEARCH="$1"
DB='installed'; [ -n "$all" ] && DB='packages'
awk -F$'\t' '$8 {print $1 " " $8}' "$PKGS_DB/$DB.info" | \
awk -F' ' -v search="$SEARCH" '
function show_deps(pkg, space,   i, n, mydeps) {
if (processed[pkg]) return
processed[pkg] = 1;
if (space) printf "%s %s\n", space, pkg;
n = split(deps[pkg], mydeps, " ");
for (i = 1; i <= n; i++)
show_deps(mydeps[i], "==" space);
}
{
for (i = 2; i <= NF; i++)
deps[$i] = deps[$i] " " $1;
}
END {
show_deps(search, "")
}
' | while read spc pkg; do
if [ -z "$mark" ]; then
pkgi="$pkg"
else
pkgi="- $pkg"; grep -q ^$pkg$'\t' "$PKGS_DB/installed.info" && pkgi="+ $pkg"
fi
echo -n $spc | sed 's/=/ /g'
echo "$pkgi ($(awk -F$'\t' -vp="$pkg" '$1==p{split($7,s," ");print s[2]}' \
"$PKGS_DB/$DB.info"))"
done
}
hrsum() {
awk '
BEGIN {
K = 1024; M = K * 1024; G = M * 1024;
SUM=0;
}
/K/ { SUM += $1 * K }
/M/ { SUM += $1 * M }
/G/ { SUM += $1 * G }
END {
if (SUM >= G) {
SUM /= G; P = "GiB";
} else if (SUM >= M) {
SUM /= M; P = "MiB";
} else {
SUM /= K; P = "KiB";
}
if (SUM >= 100) printf "%d%s", SUM, P; else printf "%.1f%s", SUM, P;
}' | sed 's|\.0||'
}
case "$1" in
depends)
unset ALL_DEPS
TMP_DIR=$(mktemp -d)
dep_scan "$2" '' | tee "$TMP_DIR/depends"
if [ -n "$total" ]; then
separator
NUM="$(wc -l < "$TMP_DIR/depends")"
TOTAL="$(sed 's|.*(\([^)]*\))|\1|' "$TMP_DIR/depends" | hrsum)"
_p 'Total: %s package (%s)' 'Total: %s packages (%s)' "$NUM" \
"$NUM" "$TOTAL"
newline
if [ -n "$mark" ]; then
NUM="$(grep '^ *-' "$TMP_DIR/depends" | wc -l)"
TOTAL="$(grep '^ *-' "$TMP_DIR/depends" | sed 's|.*(\([^)]*\))|\1|' | hrsum)"
_p 'To install: %s package (%s)' 'To install: %s packages (%s)' "$NUM" \
"$NUM" "$TOTAL"
newline
fi
fi
rm -rf "$TMP_DIR"
;;
rdepends)
cd $INSTALLED
unset ALL_DEPS
rdep_scan "$2"
;;
esac
