# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
# Distributed under the terms of the GNU General Public License v2

EAPI="4"
CROS_WORKON_PROJECT="chromiumos/platform/dev-util"
CROS_WORKON_LOCALNAME="dev"

inherit cros-workon multilib python

DESCRIPTION="Development utilities for ChromiumOS"
HOMEPAGE="http://www.chromium.org/"

LICENSE="GPL-2"
SLOT="0"
KEYWORDS="~amd64 ~arm ~x86"
IUSE="cros_host test"

RDEPEND="cros_host? ( app-emulation/qemu-kvm )
	app-portage/gentoolkit
	cros_host? ( app-shells/bash )
	!cros_host? ( !chromeos-base/gmerge )
	dev-lang/python
	dev-util/shflags
	cros_host? ( dev-util/crosutils )
	"
# These are all either bash / python scripts.  No actual builds DEPS.
DEPEND=""

src_install() {
	# Run the devserver Makefile.
	emake install DESTDIR="$D"

	dosym /build /var/lib/devserver/static/pkgroot
	dosym /var/lib/devserver/static /usr/lib/devserver/static

	if ! use cros_host; then
		dobin gmerge stateful_update
	else
		local host_tools
		host_tools=(
			cros_bundle_firmware
			cros_choose_profile
			cros_chrome_make
			cros_sign_bootstub
			cros_start_vm
			cros_stop_vm
			cros_workon
			cros_workon_make
			cros_write_firmware
			dump_i2c
			dump_tpm
			gdb_remote
			gdb_x86_local
			gmergefs
			image_to_live.sh
			paycheck.py
			blockdiff.py
			strip_package
			ssh_no_update
			willis
		)

		dobin "${host_tools[@]/#/host/}"

		# Payload generation scripts.
		dobin host/cros_generate_update_payload
		dobin host/cros_generate_stateful_update_payload

		# Repo and git bash completion.
		insinto /usr/share/bash-completion
		newins host/repo_bash_completion repo
		local f
		for f in git{,-prompt} repo; do
			dosym /usr/share/bash-completion/${f} /etc/bash_completion.d/${f}
		done

		insinto "$(python_get_sitedir)"
		doins host/lib/*.py

		insinto "$(python_get_sitedir)/update_payload"
		doins $(printf '%s\n' host/lib/update_payload/*.py | grep -v unittest)
		doins host/lib/update_payload/update-payload-key.pub.pem
	fi
}

src_test() {
	cd "${S}" # Let's just run unit tests from ${S} rather than install and run.

	# Setup FDT test file
	pushd host/tests >/dev/null
	./make-test.sh || die
	popd >/dev/null

	# Run host/lib tests
	pushd host/lib >/dev/null
	local libfile
	local test_flag
	for libfile in *.py; do
		test_flag=""
		if [[ ${libfile} != *_unittest.py ]]; then
			test_flag="--test"
		fi
		einfo Running tests in ${libfile}
		python ${libfile} ${test_flag} || \
			die "Unit tests failed at ${libfile}!"
	done
	popd >/dev/null

	pushd host/tests >/dev/null
	for ut_file in *.py; do
		echo Running tests in ${ut_file}
		PYTHONPATH=../lib python ${ut_file} ||
		die "Unit tests failed at ${ut_file}!"
	done
	popd >/dev/null

	local TESTS=()
	if ! use cros_host; then
		TESTS+=( gmerge_test.py )
		# FIXME(zbehan): import gmerge in gmerge_test.py won't work if we won't
		# have the .py.
		ln -sf gmerge gmerge.py
	else
		TESTS+=( autoupdate_unittest.py )
		TESTS+=( builder_test.py )
		TESTS+=( devserver_unittest.py )
		TESTS+=( common_util_unittest.py )
		#FIXME(zbehan): update_test.py doesn't seem to work right now.
	fi

	local test
	for test in ${TESTS[@]} ; do
		einfo "Running ${test}"
		./${test} || die "Failed in ${test}"
	done
}

pkg_preinst() {
	# Handle pre-existing possibly problematic configurations of static
	use cros_host || return 0
	if [[ -e ${ROOT}/usr/bin/static && ! -L ${ROOT}/usr/bin/static ]] ; then
		einfo "/usr/bin/static detected, and is not a symlink, performing cleanup"
		# Well, I don't know what else should be done about it. Moving the
		# files has several issues: handling of all kinds of links, special
		# files, permissions, etc. Autoremval is not a good idea, what if
		# this ended up with accidental destruction of the system?
		local newname="static-old-${RANDOM}" # In case this happens more than once.
		mv "${ROOT}"/usr/bin/static "${ROOT}"/usr/bin/${newname}
		ewarn "/usr/bin/${newname} has the previous contents of static."
		ewarn "It can be safely deleted (or kept around forever)."
	fi
}