#!/bin/bash

# Usage : parse_pkgbuilds.sh arch <pkgbuilds_dir1,dir2,...>
# Example : parse_pkgbuilds.sh i686 /var/abs/core /var/abs/extra

exit() { return; }

splitpkg_overrides=('depends' 'optdepends' 'provides' 'conflicts')
variables=('pkgname' 'pkgbase' 'pkgver' 'pkgrel' 'makedepends' 'arch' ${splitpkg_overrides[@]})
readonly -a variables splitpkg_overrides

backup_package_variables() {
	for var in ${splitpkg_overrides[@]}; do
		indirect="${var}_backup"
		eval "${indirect}=(\${$var[@]})"
	done
}

restore_package_variables() {
	for var in ${splitpkg_overrides[@]}; do
		indirect="${var}_backup"
		if [ -n "${!indirect}" ]; then
			eval "${var}=(\${$indirect[@]})"
		else
			unset ${var}
		fi
	done
}

print_info() {
	echo -e "%NAME%\n$pkgname\n"
	echo -e "%VERSION%\n$pkgver-$pkgrel\n"
	echo -e "%PATH%\n$dir\n"

	if [ -n "$pkgbase" ]; then
		echo -e "%BASE%\n$pkgbase\n"
	fi

	if [ -n "$arch" ]; then
		echo "%ARCH%"
		for i in ${arch[@]}; do echo $i; done
		echo ""
	fi
	if [ -n "$depends" ]; then
		echo "%DEPENDS%"
		for i in ${depends[@]}; do
			echo $i
		done
		echo ""
	fi
	if [ -n "$makedepends" ]; then
		echo "%MAKEDEPENDS%"
		for i in ${makedepends[@]}; do
			echo $i
		done
		echo ""
	fi
	if [ -n "$conflicts" ]; then
		echo "%CONFLICTS%"
		for i in ${conflicts[@]}; do echo $i; done
		echo ""
	fi
	if [ -n "$provides" ]; then
		echo "%PROVIDES%"
		for i in ${provides[@]}; do echo $i; done
		echo ""
	fi
}

source_pkgbuild() {
	ret=0
	dir=$1
	pkgbuild=$dir/PKGBUILD
	for var in ${variables[@]}; do
		unset ${var}
	done
	source $pkgbuild &>/dev/null || ret=$?

	# ensure $pkgname and $pkgver variables were found
	if [ $ret -ne 0 -o -z "$pkgname" -o -z "$pkgver" ]; then
		echo -e "%INVALID%\n$pkgbuild\n"
		return 1
	fi

	if [ "${#pkgname[@]}" -gt "1" ]; then
		pkgbase=${pkgbase:-${pkgname[0]}}
		for pkg in ${pkgname[@]}; do
			if [ "$(type -t package_${pkg})" != "function" ]; then
				echo -e "%INVALID%\n$pkgbuild\n"
				return 1
			else
				backup_package_variables
				pkgname=$pkg
				while IFS= read -r line; do
					var=${line%%=*}
					var="${var#"${var%%[![:space:]]*}"}"   # remove leading whitespace characters
					for realvar in ${variables[@]}; do
						if [ "$var" == "$realvar" ]; then
							eval $line
							break
						fi
					done
				done < <(type package_${pkg})
				print_info
				restore_package_variables
			fi
		done
	else
		echo
		print_info
	fi

	return 0
}

find_pkgbuilds() {
    #Skip over some dirs
    local d="${1##*/}"
    if [ "$d" = "CVS" -o "$d" = ".svn" ]; then
        return
    fi

	if [ -f $1/PKGBUILD ]; then
		source_pkgbuild $1
		return
	fi
	empty=1
	for dir in $1/*; do
		if [ -d $dir ]; then
			find_pkgbuilds $dir
			unset empty
		fi
	done
	if [ -n "$empty" ]; then
		echo -e "%MISSING%\n$1\n"
	fi
}

if [ -z "$1" -o -z "$2" ]; then
	exit 1
fi

CARCH=$1
shift
for dir in "$@"; do
	find_pkgbuilds $dir
done

exit 0