#!/bin/bash
# -----------------------------------------------------------------------------
# Tool to perform a cell-based remote bazel build using a borrowed test cell.
# -----------------------------------------------------------------------------

# Check environment
[ -z "$OCN" ] && echo "Cell environment not established" && exit 1

runTests=""

while getopts b:t?h o; do
    case "$o" in
        b) branch=$OPTARG;;
        t) runTests=true;;
        *) echo "usage: cell-build [-b branch] [-t] [commitHash]" >&2; exit 1;;
    esac
done

let OPC=$OPTIND-1
shift $OPC

# Check arguments and environment
branch=${branch:-origin/master}
baseCommit=${1:-$(git log | grep $branch | head -n1 | cut -d\  -f2)}

# Create a patch file
git diff $baseCommit > /tmp/$baseCommit.patch

# Copy patch file to the remote build machine
scp /tmp/$baseCommit.patch $ONOS_USER@$OCN:/tmp

ssh -t -t $ONOS_USER@$OCN "
    source ~/.bash_aliases
    cd \$ONOS_ROOT

    # Clean-up the workspace and stash away any changes.
    git clean -f
    git stash

    # Make sure the remote build machine is on the same commit hash as the local one
    remoteCommit=\$(git log -n 1 | head -n1 | cut -d\  -f2)
    if [ "\$remoteCommit" != "$baseCommit" ]; then
        git checkout master
        git pull
        git checkout $baseCommit
    fi

    # Apply the patch if necessary
    [ -s /tmp/$baseCommit.patch ] && git apply /tmp/$baseCommit.patch

    # Run the build (neutralizing known environment mutations in SSH sessions)
    set -e
    SHLVL=1 SSH_CLIENT=0 SSH_CONNECTION=0 bazel build onos
    if [ $runTests = true ]; then
        bazel query 'tests(//...)' | SHLVL=1 SSH_CLIENT=0 SSH_CONNECTION=0 xargs bazel test
    fi
"
