#! /bin/bash
# This script is executed in the travis-ci environment.

build_img_ghdl() {
    # Build ghdl/ghdl from ghdl/run
    echo "travis_fold:start:build_run"
    travis_time_start
    printf "$ANSI_BLUE[DOCKER build] ghdl : ${IMAGE_TAG}$ANSI_NOCOLOR\n"

    PKG=`ls | grep -oP 'ghdl-.*tgz'`
    mkdir tmp-img && cd tmp-img
    cp ../$PKG ./
    cp ../BUILD_TOOLS ./
    echo "FROM ghdl/run:$IMAGE_TAG" > Dockerfile
    echo "ADD $PKG /usr/local" >> Dockerfile
    docker build -t ghdl/ghdl:$IMAGE_TAG .
    cd ..
    travis_time_finish
    echo "travis_fold:end:build_run"
}

#---

set -e

scriptdir=$(dirname $0)

. "$scriptdir/travis-utils.sh"
. "$scriptdir/../ansi_color.sh"
#disable_color

# Display env (to debug)

echo -en "travis_fold:start:travis_env\r"
printf "$ANSI_YELLOW[TRAVIS] Travis environment $ANSI_NOCOLOR\n"
env | grep TRAVIS
echo -en "travis_fold:end:travis_env\r"


if [ "$IMAGE" = "" ]; then
    echo "IMAGE not defined"
    exit 1
fi


echo "travis_fold:start:fetch"
# The command 'git describe' (used for version) needs the history. Get it.
# But the following command fails if the repository is complete.
git fetch --unshallow || true

echo "travis_fold:end:fetch"


# Compute package name

PKG_SHORTCOMMIT="$(printf $TRAVIS_COMMIT | cut -c1-10)"
PKG_VER=`grep "ghdl_version=" configure | sed -e 's/.*"\(.*\)";/\1/'`
if [ -z "$TRAVIS_TAG" ]; then
    # No tag: use date + commit id
    PKG_TAG="$(date -u +%Y%m%d)-$PKG_SHORTCOMMIT";
elif expr "$TRAVIS_TAG" : 'v[0-9].*' > /dev/null; then
    # Remove leading 'v' in tags in the filenames.
    PKG_TAG="$(echo $TRAVIS_TAG | cut -c2-)"
else
    # Regular tag (like snapshots), nothing to change.
    PKG_TAG="$TRAVIS_TAG"
fi

# Extract from IMAGE (defined in .travis.yml)
IFS='+' read -ra REFS <<< "$IMAGE"
DDIST=${REFS[0]}  # Linux distro (eg: ubuntuXX, fedoraXX)
DBLD=${REFS[1]}   # Build/backend (eg: mcode, llvm)
DGPL=${REFS[2]}   # GPL or not

PKG_NAME="ghdl-${PKG_TAG}-${DDIST}-${DBLD}"
BUILD_CMD_OPTS="$ENABLECOLOR -b $DBLD"
if [ "$DGPL" = "gpl" ]; then
    BUILD_CMD_OPTS="$BUILD_CMD_OPTS --gpl"
    PKG_NAME="ghdl-gpl-${PKG_TAG}"
fi
BUILD_CMD_OPTS="${BUILD_CMD_OPTS} -p $PKG_NAME"

echo "build cmd: $BUILD_CMD_OPTS"


# Build

if [ "$TRAVIS_OS_NAME" = "osx" ]; then
    # Install gnat compiler (use cache)
    ./dist/macosx/install-ada.sh || exit 1
    PATH=$PWD/gnat/bin:$PATH

    bash -c "${scriptdir}/build.sh $BUILD_CMD_OPTS"
else
    # Assume linux

    # Build version.tmp and replace version.in with it (so that the version is
    # correctly set).
    # This is a little bit hack-ish, as it assumes that 'git' is not
    # available in docker (otherwise it will describe as -dirty
    # because this modifies the source file version.in).
    ghdl_version_line=`grep -e '^ghdl_version' configure`
    make -f Makefile.in srcdir=. $ghdl_version_line version.tmp
    cp version.tmp src/version.in

    # Run build in docker
    IMAGE_TAG=`echo $IMAGE | sed -e 's/+/-/g'`
    docker run --rm -t -v $(pwd):/work -w "/work" ghdl/build:$IMAGE_TAG bash -c "${scriptdir}/build.sh $BUILD_CMD_OPTS"
fi

if [ ! -f build_ok ]; then
    printf "$ANSI_RED[TRAVIS] BUILD failed $ANSI_NOCOLOR\n"
    exit 1
fi


# Test

if [ "$TRAVIS_OS_NAME" = "osx" ]; then
    bash -c "prefix=$(realpath ./install-mcode) ${scriptdir}/test.sh $BUILD_CMD_OPTS"
else
    # Build ghdl/ghdl:$IMAGE_TAG image
    build_img_ghdl
    # Run test in docker container
    docker run --rm -t -v $(pwd):/work -w "/work" ghdl/ghdl:$IMAGE_TAG bash -c "GHDL=ghdl ${scriptdir}/test.sh $BUILD_CMD_OPTS"
fi

if [ ! -f test_ok ]; then
    printf "$ANSI_RED[TRAVIS] TEST failed $ANSI_NOCOLOR\n"
    exit 1
fi
