#!/usr/bin/env bash
#*******************************************************************************
# Copyright (c) 2016 IBM Corporation and others.
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Eclipse Public License v1.0
# which accompanies this distribution, and is available at
# http://www.eclipse.org/legal/epl-v10.html
#
# Contributors:
#     David Williams - initial API and implementation
#*******************************************************************************


# This script is NOT part of production builds. It is an assist in "republishing" 
# results, such as if there is a connection problem, or a script needs to be fixed to 
# publish correctly. Even if this script "works", it does not change the files on 
# download server, they much be "re-synch'd" manually. 

# This script is only and "assist" to republish. It is not fool proof (and not well tested) 
# and its exact use depends on what ever the problem was. 

BUILD_ID=I20160527-2118
BUILD_ROOT=/shared/eclipse/builds
BUILD_MAJOR=4
BUILD_TYPE=I
postingDirectory=${BUILD_ROOT}/${BUILD_MAJOR}${BUILD_TYPE}/siteDir/eclipse/downloads/drops4
buildDirectory="${postingDirectory}/${BUILD_ID}"
echo "BUILD_ID: $BUILD_ID" 1>&2

# basebuilder (and tools) in following dir needs usually to be removed if connection problmes, or changes made
rm -vfr "${buildDirectory}/org.eclipse.releng.basebuilder"

# aggregator needs to be removed if changes to scripts there. 
# The zip needs to be republished do "downloads" if re-running tests involved (rare) but seldom hurts
rm -vfr "${buildDirectory}"/eclipse.platform.releng.aggregator
rm -vfr "${buildDirectory}"/eclipse.platform.releng.aggregator*.zip

# In some cases (rarely) may have to remove index.php (it will not be recreated by default)
# rm "${buildDirectory}/index.php"

# In some (rare) cases may have to remove compilelogs (will not be recreated by default).
# location?

# In some (most) cases may have to do a "git pull" on aggregator, to get a fix (but not recursively!)
pushd "${BUILD_ROOT}/${BUILD_MAJOR}${BUILD_TYPE}/gitCache/eclipse.platform.releng.aggregator" 1>&2
git pull
newHASH=$(git rev-parse HEAD)
echo "newHASH (after pull): $newHASH" 1>&2
popd 1>&2

# If git pull is done, need to update EBUILDER_HASH in buildproperties.shsource
oldPattern="\(export EBUILDER_HASH=\"\)\(.*\)\(\"\)"
replacePattern="\1${newHASH}\3"
replaceDirCommand="s!${oldPattern}!${replacePattern}!g" 
echo "[DEBUG] replaceCommnad: ${replaceDirCommand}" 1>&2
sed  -e "${replaceDirCommand}" "${buildDirectory}/buildproperties.shsource" > "${buildDirectory}/buildproperties.shsourceTEMPNEW"
RC=$?
if [[ $RC != 0 ]]
then 
  echo "sed returned non-zero return code: $RC" 1>&2
  exit $RC
else
  cp --backup=numbered "${buildDirectory}/buildproperties.shsourceTEMPNEW" "${buildDirectory}/buildproperties.shsource"
  #TODO check return code of cp
  echo "replaced original buildproperties.shsource (after backing up original)"
fi

# sometimes, but rearly, the production directory may need to be replaced changes made.
export SCRIPT_PATH="${BUILD_ROOT}/${BUILD_MAJOR}${BUILD_TYPE}/production"
# now republish! 
${SCRIPT_PATH}/publish-eclipse.sh ${buildDirectory}/buildproperties.shsource 2>&1 | tee republishout.txt


