#!/usr/bin/env bash

# it is assumed we are executing this in RELENG_TESTS or the parent of RELENG_TESTS

# Note: for deployment on production machine, no "custom" properties need to be set in aggr_properties.shsource, 
# assuming the "hudson build script" has been set up appropriately. 
# 1. need to set "use custom workspace" so some of the relative directory assumptions are true ... such as for indigo, set 
#    /shared/indigo/org.eclipse.indigo.tests
# 2. copy "by hand" (or scp) this getRelengTests.sh file to /shared/indigo and run from hudson from there, the parent of 
#    o.e.i.tests, namely "run shell script" /shared/indigo/getRelengTests.sh
# 3. We currently assume "testInstance" already exists, as a child of /shared/indigo, and contains an instance of eclipse SDK (3.7). 


# finds file on users path, before current directory
# hence, non-production users can set their own values for test machines
source aggr_properties.shsource
  
if [ -z ${RELENG_TESTS} ] ; then
   RELENG_TESTS=org.eclipse.indigo.tests
fi

# This script file is to help get builds started "fresh", when
# the ${RELENG_TESTS} directory already exists on local file system.
# While it is in the cvs repository in ${RELENG_TESTS}, it is
# meant to be executed from the parent directory
# of ${RELENG_TESTS} on the file system.

# export is used, instead of checkout, just to avoid the CVS directories and since this code
# for a local build, there should never be a need to check it back in to CVS.

# If there is no subdirectory, try going up one directory and looking again (in case we are in it).
if [ ! -e ${RELENG_TESTS} ]
then
	cd ..
	if [ ! -e ${RELENG_TESTS} ]
	then	
         echo "${RELENG_TESTS} does not exist as sub directory";
	     exit 1;
	fi
fi


# make sure RELENG_TESTS has been defined and is no zero length, or 
# else following will eval to "rm -fr /*" ... potentially catastrophic
if [ -z "${RELENG_TESTS}" ]
then
   echo "The variable RELENG_TESTS must be defined to run this script"
   exit 1;
fi
echo "    removing all of ${RELENG_TESTS} ..."
rm -fr "${RELENG_TESTS}"/*
rm -fr "${RELENG_TESTS}"/.project
rm -fr "${RELENG_TESTS}"/.settings
rm -fr "${RELENG_TESTS}"/.classpath
mkdir -p "${RELENG_TESTS}"

#controltag=david_williams_tempBranch3
controltag=HEAD
echo "    checking out $controltag of ${RELENG_TESTS} from cvs ..."

export CVS_RSH=SSH
if [ -z ${CVS_INFO} ] ; then
   CVS_INFO=:pserver:anonymous@dev.eclipse.org:
fi

cvs -Q -f -d ${CVS_INFO}/cvsroot/callisto  export -d ${RELENG_TESTS} -r $controltag ${RELENG_TESTS}


echo "    making sure releng control files are executable and have proper EOL ..."
dos2unix ${RELENG_TESTS}/*.sh* ${RELENG_TESTS}/*.properties ${RELENG_TESTS}/*.xml >/dev/null 2>>/dev/null
chmod +x ${RELENG_TESTS}/*.sh > /dev/null
echo

if [ -z ${BUILD_HOME} ] ; then
    BUILD_HOME=${PWD}
fi

# TODO Install test instance (and tests) via build.xml as we do "aggregator and tools"
# TODO Better to use p2 to install into test instance
rm -fr ${BUILD_HOME}/testInstance/eclipse/dropins/${RELENG_TESTS}
cp -r ${RELENG_TESTS}  ${BUILD_HOME}/testInstance/eclipse/dropins/
