#!/bin/sh
#
# Cleanup old packages and sources
#
# usage:
#    apkg-clean [-p] [-s] | xargs rm

# Given a source entry from an abuild, return the filename that would be stored.
source_filename() {
	s=${1%::noextract}
	case $s in
		*::*) printf '%s' "${s%%::*}";;
		   *) printf '%s' "${s##*/}";;
	esac
}

# Print stale .spm package files (old versions that don't match current name#version-release.spm).
stale_packages() {
	if [ "$APKG_PACKAGE_DIR" ]; then
		# Collect all current .spm names, then check the centralized dir once.
		keep=""
		for i in $(apkg -s 2>/dev/null); do
			dir=$(apkg -p "$i" 2>/dev/null) || continue
			unset name version release
			. "$dir/abuild" 2>/dev/null
			keep="$keep $name#$version-$release.spm"
		done
		for f in "$APKG_PACKAGE_DIR"/*.spm; do
			[ -f "$f" ] || continue
			case " $keep " in
				*" ${f##*/} "*) continue;;
			esac
			printf '%s\n' "$f"
		done
	else
		for i in $(apkg -s 2>/dev/null); do
			dir=$(apkg -p "$i" 2>/dev/null) || continue
			unset name version release
			. "$dir/abuild" 2>/dev/null
			current="$name#$version-$release.spm"
			for f in "$dir"/*.spm; do
				[ -f "$f" ] || continue
				[ "${f##*/}" != "$current" ] && printf '%s\n' "$f"
			done
		done
	fi
}

# Print stale source files (not referenced by any package's current source variable).
stale_sources() {
	if [ "$APKG_SOURCE_DIR" ]; then
		# Collect all current source filenames across all recipes.
		keep=""
		for i in $(apkg -s 2>/dev/null); do
			dir=$(apkg -p "$i" 2>/dev/null) || continue
			unset source
			. "$dir/abuild" 2>/dev/null
			for s in $source; do
				keep="$keep $(source_filename "$s")"
			done
		done

		for f in "$APKG_SOURCE_DIR"/*; do
			[ -f "$f" ] || continue
			case " $keep " in
				*" ${f##*/} "*) continue;;
			esac
			printf '%s\n' "$f"
		done
	else
		# Check each recipe directory, filtering out recipe files and current sources.
		for i in $(apkg -s 2>/dev/null); do
			dir=$(apkg -p "$i" 2>/dev/null) || continue
			unset source
			. "$dir/abuild" 2>/dev/null

			keep=""
			for s in $source; do
				keep="$keep $(source_filename "$s")"
			done

			(cd "$dir" 2>/dev/null || continue
			for f in *; do
				[ -f "$f" ] || continue
				case $f in
					abuild|depends|preinstall|postinstall|info|\
					*.spm|.shasum|.files) continue;;
				esac
				case " $keep " in
					*" $f "*) continue;;
				esac
				printf '%s\n' "$PWD/$f"
			done
			)
		done
	fi
}

do_pkg=true
do_src=true

for arg; do
	case $arg in
		-p) do_src=false;;
		-s) do_pkg=false;;
		-h) cat <<EOF
usage:
    $0 [-p] [-s] | xargs rm -v

options:
    -p  print packages only
    -s  print sources only

EOF
		exit 0;;
	esac
done

$do_pkg && stale_packages
$do_src && stale_sources
exit 0
