#!/bin/sh skip() { k=$(echo -n "$1" | tr -c [:alnum:] _) eval v=\"\$h_$k\" [ -n "$v" ] && return 0 || eval h_$k=1 && return 1 } dpath() { local l p for p do skip "$p" && continue l=$(pkg query %rn-%rv "$p") l=$(echo $l) # convert to single line [ -z "$l" ] && continue case " $l " in *" $goal "*) res="$p $goal"; return 0;; esac dpath $l && res="$p $res" && return 0 done return 1 } goal="$2" dpath "$1" && echo $res && return 0 return 1 # EOF