#!/bin/sh -e
#
# script for purging makedepends packages from system

tmpfile=/tmp/apkg-mdpurge.$$

cleanup() {
	rm -f "$tmpfile"
}

trap cleanup EXIT

mdpurge() {
	path=$(apkg -p $1)
	if [ ! -s "$path/makedepends" ]; then
		echo "No makedepends for $1"
		return 0
	fi

	for m in $(grep -Ev ^'(#|$)' "$path/makedepends" | awk '{print $1}'); do
		[ "$(apkg -a ^$m$)" ] || continue

		for d in $(apkg -j $m); do
			[ "$d" = "$1" ] && continue
			[ "$(apkg -a ^$d$)" ] && {
				[ "$verbose" ] && echo "[$m] dependent package is installed: $d"
				error=1
			}
		done
		[ "$error" ] && return 1

		if [ "$purgeit" ]; then
			spm -r $m
		else
			echo $m
		fi
	done
}

scan_all() {
	for p in $(apkg -a); do
		path=$(apkg -p $p 2>/dev/null) || continue
		[ -s "$path/makedepends" ] || continue
		grep -Ev ^'(#|$)' "$path/makedepends" | awk '{print $1}' >> "$tmpfile"
	done
	[ -s "$tmpfile" ] || return 0

	sort -u "$tmpfile" | while read -r m; do
		[ "$(apkg -a ^$m$)" ] || continue

		for d in $(apkg -j $m); do
			[ "$(apkg -a ^$d$)" ] && {
				[ "$verbose" ] && echo "[$m] runtime dependent is installed: $d"
				error=1
				break
			}
		done
		[ "$error" ] && { unset error; continue; }

		if [ "$purgeit" ]; then
			spm -r $m
		else
			echo $m
		fi
	done
	rm -f "$tmpfile"
}

help() {
	cat <<EOF
usage:
	$0 [-p] [pkgs]

	With package arguments, remove only their makedepends.
	With no arguments, scan all installed packages for orphaned makedepends.

option:
	-p  remove makedepends from system
	-v  show why a makedepends was skipped

EOF
	exit 0
}

while [ "$1" ]; do
	case $1 in
		-p) purgeit=1;;
		-v) verbose=1;;
		-h) help;;
		 *) pkg="$pkg $1";;
	esac
	shift
done

if [ "$pkg" ]; then
	for p in $pkg; do
		apkg -p $p >/dev/null || continue
		apkg -a | grep -qx $p || continue
		mdpurge $p
	done
else
	scan_all
fi

exit 0
