#!/usr/bin/env bash

# In this example utility, we make use of the "fetchAndbuild.xml" file.
# It would likely need some "adjustment" to some variables 
# for others to use from their own command line. 

export BUILD_HOME=${PWD}/BUILDAREA
mkdir -p ${BUILD_HOME}
# This is there we will "tee" the output of the ant command.
buildOutput=${BUILD_HOME}/buildoutput$( date +%Y%m%d-%H%M).log.txt

# Assuming nothing else, we start by getting one file which
# can bootstrap the whole process. getSimRelTools.sh will either
# clone or pull the "org.eclipse.simrel.tools" project which 
# then contains the other utilities and files needed to do the 
# aggregation build from the command line.

# set getTools to false if tools already exists, with local modifications
getTools=${getTools:-"true"}
if [[ ${getTools} == "true" ]]
then
  wget --no-verbose -O ${BUILD_HOME}/getSimRelTools.sh https://git.eclipse.org/c/simrel/org.eclipse.simrel.tools.git/plain/bootstrapScript/getSimRelTools.sh 2>&1
  RC=$?
  if [[ $RC != 0 ]]
  then
    printf "\n[ERROR] wget returned non-zero return code: $RC. Exiting"
    exit 1
  fi
  chmod +x ${BUILD_HOME}/getSimRelTools.sh
  RC=$?
  if [[ $RC != 0 ]]
  then
    printf "\n[ERROR] chmod returned non-zero return code: $RC. Exiting"
    exit 1
  fi
  ${BUILD_HOME}/getSimRelTools.sh
  RC=$?
  if [[ $RC != 0 ]]
  then
    printf "\n[ERROR] getSimRelTools.sh returned non-zero return code: $RC. Exiting"
    exit 1
  fi
else
  printf "\n[INFO] 'getTools' was set to false, so simrel.tools not fetched."
fi

# We require Java to be version 8 and Ant to be at least "1.8".
# (And, for example, the defaults on "build.eclipse.org" are still
# set at Java 6 and Ant 1.7!) These may not be needed if your 
# personal machine has the defaults required.

#export JAVA_HOME=/shared/common/jdk1.8.0_x64-latest
#export ANT_HOME=/shared/common/apache-ant-1.8.2
#export PATH=${JAVA_HOME}/jre/bin:${ANT_HOME}/bin/:$PATH

#
# In addition to using the getModelFromGit target on ant command line, 
#   One of the following "aggregation targets" can be specified.
#   (Actually, if none specified, runAggregatorValidateOnly is the default.)
# runAggregatorValidateOnly
# runAggregatorBuildOnly
# runAggregatorCleanBuild
#
# In addition to the targets, the following are some handy parameters which 
# may be specified to override the defaults.
#  -DplatformLocation=file:///absolutePath/ofLocal/PlatformBinary.tar.gz
#     The scripts must be able to find a standard "Eclipse Platform" to install into.
#     The default is what it would be if running on the Eclipse.org infrastructure, so 
#     if running locally this value (correct location of local version) will need to be provided.
# -Drelease=oxygen
#     The 'release' value is typically required, even if building against 'master',
#     since its "correct" value would change from year to year.
#     While we could "assume" a value, if the value is wrong, it has the potential 
#     to "damage" data in staging repo (i.e. replaces with wrong thing), hence
#     we require it to be explicit.
# -DBUILD_BRANCH=Neon_maintenance
#     'BUILD_BRANCH' is assumed to be "master" unless overridden on command line.
#     The value of 'release' should of course match whatever branch is being built.
# -DinstallEclipseAndTools
#    'installEclipseAndTools' causes Eclipse, the aggregator, wtp releng tools, and the p2repo analyzer tools
#    to be reinstalled, if already present. (They are always installed, if "eclipse" is not
#    installed to begin with.)
# -Dgit_protocol=file://
#    'git_protocol' specifies an alternative way to "get" the git repositories of the 'simrel.build' and 'simrel.tools'. 
#    Can be slightly more efficient and reliable to use direct file access instead
#    of the default of "git://git.eclipse.org".
# -DrewriteRepositoryURLValue=file:///home/data/httpd/download.eclipse.org
#    'rewriteRepositoryURLValue' is, again, a way to specify the file protocol be used, 
#    but in this case is is for the input that comes from the *.aggr* files in 'simrel.build'.
#    Using the parameter assumes, of course, you really do have "file" access, such as if 
#    running on build.eclipse.org, or running against a local mirror of that 'simrel.build' repo.

ant -f ${BUILD_HOME}/org.eclipse.simrel.tools/fetchAndbuild.xml \
  -DBUILD_HOME=${BUILD_HOME} \
  -DplatformLocation=file:///home/data/httpd/archive.eclipse.org/eclipse/downloads/drops4/R-4.8-201806110500 \
  -Drelease=oxygen \
  getModelFromGit runAggregatorValidateOnly 2>&1 | tee ${buildOutput}
