#!/bin/bash
set -e -o pipefail

# This wrapper copies an executable to a target device and executes it there.
#
# Usage: go_target_exec <target> <binary> <args>...
#
# This script can work with both ChromeOS/Android devices.
#
# It uses "target_tmpdir" to get the path to the temporary directory on the device.
# It uses "target_cp" to copy the binary to the temporary directory on the device.
# It uses "target_sh" to execute the binary remotely and get the output/exitcode.

target="$1"
shift

binary="$1"
shift

# Get path to temporary directory on device and copy the binary over.
tmpdir="$(target_tmpdir)"
target_cp ${binary} ${target}:${tmpdir}/a.out

# If current directory is inside GOROOT, then execute the binary in the
# corresponding directory inside GOROOT on the device.
targetdir="${tmpdir}"
goroot="$(go_${target} env GOROOT)"
if [[ "${PWD}" == ${goroot}/src/* ]]
then
	targetdir="${tmpdir}/go/src/${PWD#${goroot}/src/}"
fi

# Set GOROOT, and forward some environment variables to the remote shell.
vars="GOROOT=${tmpdir}/go"
vars+="${GOOS:+ GOOS=${GOOS}}"
vars+="${GOARCH:+ GOARCH=${GOARCH}}"
vars+="${GOMAXPROCS:+ GOMAXPROCS=${GOMAXPROCS}}"
vars+="${GOTRACEBACK:+ GOTRACEBACK=${GOTRACEBACK}}"

# Remotely execute the binary using ssh (for ChromeOS) or adb (for Android).
target_sh ${target} "cd ${targetdir} && ${vars} ${tmpdir}/a.out $*"