#!/bin/bash
# Copyright 2010-2014 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

# These are the versions we care about.  The rest are just "nice to have".
PYTHON_SUPPORTED_VERSIONS="2.6 2.7 3.2 3.3 3.4"
PYTHON_VERSIONS="2.6 2.7 pypy 3.1 3.2 3.3 3.4 3.5"

# has to be run from portage root dir
cd "${0%/*}" || exit 1

case "${NOCOLOR:-false}" in
	yes|true)
		GOOD=
		BAD=
		NORMAL=
		;;
	no|false)
		GOOD=$'\e[1;32m'
		BAD=$'\e[1;31m'
		NORMAL=$'\e[0m'
		;;
esac

interrupted() {
	echo "interrupted." >&2
	exit 1
}

trap interrupted SIGINT

unused_args=()
IGNORE_MISSING_VERSIONS=true

while [ $# -gt 0 ] ; do
	case "$1" in
		--python-versions=*)
			PYTHON_VERSIONS=${1#--python-versions=}
			IGNORE_MISSING_VERSIONS=false
			;;
		--python-versions)
			shift
			PYTHON_VERSIONS=$1
			IGNORE_MISSING_VERSIONS=false
			;;
		*)
			unused_args[${#unused_args[@]}]=$1
			;;
	esac
	shift
done
if [[ ${PYTHON_VERSIONS} == "supported" ]] ; then
	PYTHON_VERSIONS=${PYTHON_SUPPORTED_VERSIONS}
fi

set -- "${unused_args[@]}"

eprefix=${PORTAGE_OVERRIDE_EPREFIX}
exit_status="0"
found_versions=()
status_array=()
for version in ${PYTHON_VERSIONS}; do
	if [[ $version = 'pypy' ]] ; then
		executable=${eprefix}/usr/bin/pypy
	else
		executable=${eprefix}/usr/bin/python${version}
	fi
	if [[ -x "${executable}" ]]; then
		echo -e "${GOOD}Testing with Python ${version}...${NORMAL}"
		"${executable}" -b -Wd pym/portage/tests/runTests.py "$@"
		status=$?
		status_array[${#status_array[@]}]=${status}
		found_versions[${#found_versions[@]}]=${version}
		if [ ${status} -ne 0 ] ; then
			echo -e "${BAD}Testing with Python ${version} failed${NORMAL}"
			exit_status="1"
		fi
		echo
	elif [[ ${IGNORE_MISSING_VERSIONS} != "true" ]] ; then
		echo -e "${BAD}Could not find requested Python ${version}${NORMAL}"
		exit_status="1"
	fi
done

if [ ${#status_array[@]} -gt 0 ] ; then
	max_len=0
	for version in ${found_versions[@]} ; do
		[ ${#version} -gt ${max_len} ] && max_len=${#version}
	done
	(( columns = max_len + 2 ))
	(( columns >= 7 )) || columns=7
	printf "\nSummary:\n\n"
	printf "| %-${columns}s | %s\n|" "Version" "Status"
	(( total_cols = columns + 11 ))
	eval "printf -- '-%.0s' {1..${total_cols}}"
	printf "\n"
	row=0
	for version in ${found_versions[@]} ; do
		if [ ${status_array[${row}]} -eq 0 ] ; then
			status="success"
		else
			status="fail"
		fi
		printf "| %-${columns}s | %s\n" "${version}" "${status}"
		(( row++ ))
	done
fi

exit ${exit_status}
