#!/bin/bash
d="`pwd`/deptree.dot"
deptree=/run/openrc/deptree
echo "digraph deptree {" > $d

good="$*"
if [ -z "$good" ]; then
	echo "No arguments given" 1>&2
	b=$(basename $0)
	echo "Syntax: $b SERVICE SERVICE..." 1>&2
	exit 1
fi
echo "building for: $good"

source $deptree

format() {
	n="${1//-/_}"
	n="${n//./_}"
	n="${n//:/_}"
	echo "$n"
}

max=$(tail -n1 $deptree |cut -d_ -f2)

fetch() {
	varbase=$1
	want=$2
	local i=0
	local varname=${varbase}_${want}_${i}
	while [ -n "${!varname}" ]; do
		echo "${!varname}"
		i=$(($i+1))
		varname=${varbase}_${want}_${i}
	done
}

for b in `seq 1 $max`; do
	varname=depinfo_$b
	raw=${varname}_service ; raw="${!raw}"
	keyword="$(fetch $varname keyword)"
	iafter="$(fetch $varname iafter)"
	ibefore="$(fetch $varname ibefore)"
	ineed="$(fetch $varname ineed)"
	needsme="$(fetch $varname needsme)"
	iprovide="$(fetch $varname iprovide)"
	providedby="$(fetch $varname providedby)"
	iuse="$(fetch $varname iuse)"
	usesme="$(fetch $varname usesme)"

	n="$(format "${raw}")"
	if [ "${good//${n}}" != "${good}" ]; then
		echo "$n [label=\"$raw\"];" >> $d
		for x in $ineed ; do
			if [ "${good//${x}}" != "${good}" ]; then
				x="$(format "${x}")"
				echo "$n -> $x [label=\"need\"];" >>$d
			fi
		done
		for x in $iuse ; do
			if [ "${good//${x}}" != "${good}" ]; then
				x="$(format "${x}")"
				echo "$n -> $x [label=\"use\"];" >>$d
			fi
		done
		for x in $ibefore ; do
			if [ "${good//${x}}" != "${good}" ]; then
				x="$(format "${x}")"
				echo "$n -> $x [label=\"before\"];" >>$d
			fi
		done
		for x in $iafter ; do
			if [ "${good//${x}}" != "${good}" ]; then
				x="$(format "${x}")"
				echo "$x -> $n [label=\"after\"];" >>$d
			fi
		done
	fi
done;

echo "}" >> $d
dot ${d} -Tpng -o ${d/.dot/.png}
