#!/bin/sh count() { set -- $(wc -l "$1") echo $1 } check_all_notinst() { for p do pkg info -qe $p && return 1 done return 0 } find_level() { echo processing level $1... >&2 if [ "$1" = "001" ]; then t=0 pkg info | awk '{print $1}' | while read name do [ -z "`pkg info -qd $name`" ] && echo $name t=$(($t+1)) printf "%u\r" $t >&2 done > l001 max=$(pkg info | wc -l) return fi cat l* > "s$1" n=$(($max-`count "s$1"`)) t=0 pkg info | awk '{print $1}' | fgrep -xvf "s$1" | while read name do t=$(($t+1)) printf "%u of %u\r" $t $n >&2 deps="`pkg info -qd $name | grep -xvf s$1`" check_all_notinst $deps && echo $name done > "l$1" } rm -f l* s* i=001 find_level $i while [ -s "l$i" ] do i=$(echo $i+1 |bc) i=$(printf "%03d" $i) find_level $i done