#!/usr/bin/env bash

# directly gets a fresh copy of sdk directory from eclipsebuilder
# need to manually check and make sure nothing is running or will
# be running soon.

source localBuildProperties.shsource 2>/dev/null

# Normally, we should be "working in" /shared/eclipse ... the parent of 'sdk' directory.
export WORK_DIR=${WORK_DIR:-${PWD}}

# codifying the branch (or tag) to use, so it can be set/chagned in one place
branch=master
initScriptTag="h=$branch"

# to use a tag instead of branch, would be tag=X, such as
# tag=vI20120417-0700, or in full form
# http://${GIT_HOST}/c/platform/eclipse.platform.releng.eclipsebuilder.git/plain/scripts/wgetFresh.sh?tag=vI20120417-0700

# = = = = = = =

function errorExit ()
{
  MSG=$1
  RETURN_CODE=$2
  # We will count no message as a warning, but, is intended for caller to provide,
  # so is technically a programming error.
  if [[ -z "{MSG}" ]]
  then
    printf "\n\tWARNING: /t%s" "Call to errorExit provided no message"
    MSG="No message provided."
  fi
  # May be legitimate not to provide "exit status", in which case we just use '1'.
  # TODO: Deluxe version would check for positive integer between 0 and 255
  if [[ -z "${RETURN_CODE}" ]]
  then
    $RETURN_CODE=1
  fi
  # Here is whole purpose of this method.
  printf "\n\tERROR: \t%s" "${MSG} Exit Status: ${RETURN_CODE}"
}

function checkForErrorExit ()
{
  # arg 1 must be return code, $?
  # arg 2 (remaining line) can be message to print before exiting due to non-zero exit code
  exitCode=$1
  shift
  message="$*"
  if [[ -z "${exitCode}" ]]
  then
    echo -e "\n\tPROGRAM ERROR: checkForErrorExit called with no arguments\n"
    exit 1
  fi
  if [[ -z "${message}" ]]
  then
    echo -e "\n\tWARNING: checkForErrorExit called without message\n"
    message="(Calling program provided no message)"
  fi
  if [[ "${TEST_MODE}" == "true" ]]
  then
    echo -e "\t\tTest mode: exitCode: $exitCode \t message: ${message}"
  fi
  if [[ ${exitCode} -lt 0 ]]
  then
    # This is just a "fact of the way bash works" ... but, hard to debug if not expecting it.
    echo -e "\n\t WARNING: exitCode was less than 0, ${exitCode}, so actual value will be different. $(( ${exitCode} & 255 )) \n"
    exitCode=$(( ${exitCode} & 255 ))
  fi
  if [[ ${exitCode} -gt 255 ]]
  then
    # This is just a "fact of the way bash works" ... but, hard to debug if not expecting it.
    echo -e "\n\t WARNING: exitCode was greater than 255, ${exitCode}, so value on exit will be modulo 256. $(( ${exitCode} % 256 )) \n"
    exitCode=$(( ${exitCode} % 256 ))
  fi
  if [[ ! ${exitCode} =~ ^[0-9]+$ ]]
  then
    echo -e "\n\t WARNING: exitCode was not all digits.\n\t Arbitrarily set exitCode to 1 (and may have unintended results).\n"
    exitCode=1
  fi
  if [[ ${exitCode} != 0 ]]
  then
    if [[ "${TEST_MODE}" == "true" ]]
    then
      echo -e "\n\t ERROR. exit code: ${exitCode}  ${message} \tTest mode: otherwise would have exited with ${exitCode}"
    else
      echo -e "\n\t ERROR. exit code: ${exitCode}  ${message}\n"
      exit ${exitCode}
    fi
  else
    if [[ "${TEST_MODE}" == "true" ]]
    then
      echo -e "\t\tTest mode: returned 0 (no exit)"
    fi
    return 0
  fi
}

# = = = = =

if [[ "$1" == "-t" ]]
then
  TEST_MODE=true
  echo -e "\n\tStarting self test mode, since '-t' specified. Will exit when done with tests.\n"
  checkForErrorExit 0 #no message case
  checkForErrorExit 0 "Normal zero case."
  checkForErrorExit 0 "Normal zero as string case."
  checkForErrorExit abcd "String, not numeric case."
  checkForErrorExit 255 "Number exactly 255 cases."
  checkForErrorExit -1 "Negative number case."
  checkForErrorExit -2 "Negative number case."
  checkForErrorExit 512 "Number greater than 255 case."

  echo -e "\n\tTest mode completed normally.\n"
  exit 0
fi

cd "${WORK_DIR}"
checkForErrorExit $? "could not change directory parent of sdk, ${WORK_DIR}."

# as a sanity check, we make sure WORK_DIR is defined to be something, and not equal to "/" or ${HOME}
# since some "removes" either won't work, or risk removing things we do not intend.
if [[ -z "${WORK_DIR}" ]]
then
  errorExit "WORK_DIR was not defined."
fi
if [[ "${WORK_DIR}" == "/" || "${WORK_DIR}" == "${HOME}" ]]
then
  errorExit "WORK_DIR inappropriately defined as ${WORK_DIR}"
fi

# remove if exists from previous (failed) run
if [[ -e "${WORK_DIR}/tempeb" ]]
then
  rm -fr "${WORK_DIR}/tempeb"
  checkForErrorExit $? "Could not remove directory tempeb"
else
  mkdir -p "${WORK_DIR}/tempeb"
  checkForErrorExit $? "could not mkdir tempeb"
fi

# ditto
if [[ -e "${WORK_DIR}/master.zip" ]]
then
  rm "${WORK_DIR}/master.zip"
  checkForErrorExit $? "Could not remove master.zip"
fi

if [[ -z "${GIT_HOST}" ]]
then
  GIT_HOST=git.eclipse.org
fi

wget --no-verbose --no-cache -O "${WORK_DIR}/master.zip" http://${GIT_HOST}/c/platform/eclipse.platform.releng.aggregator.git/snapshot/master.zip 2>&1;
checkForErrorExit $? "could not get aggregator?!"

unzip -q "${WORK_DIR}/master.zip" -d "${WORK_DIR}/tempeb"
checkForErrorExit $? "could not unzip master?!"

# save a copy to diff with (and to revert to if needed)
# after first moving any previous copies.
# will need to manually cleanup dated backups occasionally
if [[ -d "${WORK_DIR}/sdkTempSave" ]]
then
  NOWDATE=$( date -u +%Y%m%d%H%M )
  NEWNAME=sdkTempSave${NOWDATE}
  mv "${WORK_DIR}/sdkTempSave" "${WORK_DIR}/${NEWNAME}"
  checkForErrorExit $? "could not mv sdkTempSave to ${NEWNAME}"
fi

# It won't exist, if first time running script, for example.
if [[ -e sdk ]]
then
  mv "${WORK_DIR}/sdk" "${WORK_DIR}/sdkTempSave"
  checkForErrorExit $? "could not mv sdk to sdkTempSave"
fi

rsync -r "${WORK_DIR}/tempeb/master/production/sdk/" "${WORK_DIR}/sdk"
checkForErrorExit $? "could not rsync -r ${WORK_DIR}/tempeb/master/production/sdk/ to ${WORK_DIR}/sdk"

# there won't be an sdkTempSave, if first time script is ran, for example.
if [[ -e "${WORK_DIR}/sdkTempSave" ]]
then
  if [[ -e "${WORK_DIR}/sdkdiffout.txt" ]]
  then
    # not positive why, but I've seen us get here, but NOWDATE not defined yet.
    # But could happen from various scenerios of deleting files or directories involved.
    if [[ -z "${NOWDATE}" ]]
    then
      NOWDATE=$( date -u +%Y%m%d%H%M )
    fi
    mv "${WORK_DIR}/sdkdiffout.txt" "${WORK_DIR}/sdkdiffout${NOWDATE}.txt"
    checkForErrorExit $? "could not mv sdkdiffout.txt to sdkdiffout${NOWDATE}.txt"
  fi
  diff -w -r "${WORK_DIR}/sdk" "${WORK_DIR}/sdkTempSave" > "${WORK_DIR}/sdkdiffout.txt"
  # It's normal for diff to return '1', if differences are found. returns '0' if no differences found.
  # No need to 'exit' for either '0' or '1'.
  # Even '2' may or may not be ok, See "info diff".
  # So, we'll not check return codes for 'diff'.
  # checkForErrorExit $? "could not run diff"
fi

find "${WORK_DIR}/sdk" -name "*.sh" -exec chmod -c +x '{}' \;
checkForErrorExit $? "could not run find"

# cleanup
rm "${WORK_DIR}/master.zip"
checkForErrorExit $? "could not cleanup (rm) master.zip"
rm -fr "${WORK_DIR}/tempeb"
checkForErrorExit $? "could not cleanup (rm) tempeb"

# sdkdiff will not always exist, such as, if first time running.
if [[ -e "${WORK_DIR}/sdkdiffout.txt" ]]
then
  echo -e "\n\tNormal exit. Check sdkdiffout.txt to confirm expected differences were obtained.\n"
else
  echo -e "\n\tNormal exit."
fi

