#!/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
#*******************************************************************************


# boot strap basic variable values, to drive Eclipse Platform builds.

# We set RAWDATE first thing, just to make it more accurate of the "start of the build".
# We have found on Hudson (but never by cron jobs) that by the time the build starts, it is often already 1 minute 
# past the time we scheduled. This may eventually be fixed (or improved) in Hudson (see bug 496403). 
# Initially we tried heuristic of deducting 60 seconds (bug 496345) but occasionally Hudson would start the job in, say 51 seconds, making
# our build ID a minute less that it should be. Then we tried 30 seconds (bug 500233), but given a look at the long term history
# of Hudson "start" times, it seems 30 seconds may fail at times too. 
# So modified to truncate "epoch seconds" to the nearest 5 minutes since in our production builds we always schedule them 
# to start at "even" times, such as "on the hour", occasionally "on the half hour", and rarely on "quarter hours" and maybe once at 10 after. :) 
# So as long as schedule as it currently is, it seems truncating to nearest 5 minutes will always work. We have seen Hudson "delay times" range from 
# about 20 seconds to at most about 2 minutes, but never any near 5 minutes so that shouldn't be a concern, 
# unless Hudson delays start to get really long (over 5 minutes) for some reason.
if [[ -z "${RAWDATE}" ]]
then
  RAWDATE=$( date +%s )
  remainder=$(( RAWDATE % 300 ))
  RAWDATE=$((RAWDATE - remainder))
  export RAWDATE
  echo -e "\n\t[DEBUG] RAWDATE in ${0##*/} was empty (as expected) so setting to \"now minus $remainder\" (truncating to nearest 5 minutes): ${RAWDATE}\n"
else 
  echo -e "\n\t[DEBUG] RAWDATE in ${0##*/} was already set. RAWDATE: ${RAWDATE}\n"
fi
if [[ -z "${SCRIPT_PATH}" ]]
then
   echo -e "\n\t[ERROR] SCRIPT_PATH is not defined as expected in ${0##*/}"
   exit 1
else 
   echo -e "\n\t[INFO] SCRIPT_PATH defined as ${SCRIPT_PATH}"
fi
source "${SCRIPT_PATH}/bashUtilities.shsource"

# USAGE: fn-git-cache BUILD_ROOT
#   ROOT: /shared/eclipse/builds/${major}${type}
fn-git-cache ()
{
  # we (now) leave branch our of git-cache path, or else "topic branches", such as
  # 'david_williams/II20130409-0900' complicates directory structure
  checkNArgs $# 1
  if [[ $? != 0 ]]; then return 1; fi
  ROOT="$1"; shift
  echo $ROOT/gitCache
}
# USAGE: fn-git-dir GIT_CACHE URL
#   GIT_CACHE: /shared/eclipse/builds/R4_2_maintenance/gitCache
#   URL: file:///gitroot/platform/eclipse.platform.releng.aggregator.git
fn-git-dir ()
{
  checkNArgs $# 2
  if [[ $? != 0 ]]; then return 1; fi
  GIT_CACHE="$1"; shift
  URL="$1"; shift
  echo $GIT_CACHE/$( basename "$URL" .git )
}


# USAGE: fn-build-id BUILD_TYPE
#   BUILD_TYPE: I, M, N, X, Y, P

fn-build-id ()
{
  checkNArgs $# 1
  if [[ $? != 0 ]]; then return 1; fi
  BUILD_TYPE="$1"; shift
  TIMESTAMP=$( date +%Y%m%d-%H%M --date='@'$RAWDATE )
  echo ${BUILD_TYPE}${TIMESTAMP}
}


# USAGE: fn-build-dir ROOT BUILD_ID STREAM
#   ROOT: /shared/eclipse/builds
#   BUILD_ID: M20121119-1900
#   STREAM: 4.3.0
fn-build-dir ()
{
  checkNArgs $# 3
  if [[ $? != 0 ]]; then return 1; fi
  ROOT="$1"; shift
  BUILD_ID="$1"; shift
  STREAM="$1"; shift
  eclipseStreamMajor=${STREAM:0:1}
  dropDirSegment=siteDir/eclipse/downloads/drops
  if (( $eclipseStreamMajor > 3 ))
  then
    dropDirSegment=siteDir/eclipse/downloads/drops4
  fi
  echo $ROOT/$dropDirSegment/$BUILD_ID
}


  # if not defined "externally", then something is wrong 
  # with our assumptions and we should simply fail here. 
  # If the definition ever needs to be put back here, then 
  # see bootstrap.shsource for how REPO_AND_ACESS is defined. 
  assertNotEmpty REPO_AND_ACCESS

  if [[ -z "${AGGREGATOR_REPO}" ]]
  then
    export AGGREGATOR_REPO=${REPO_AND_ACCESS}/platform/eclipse.platform.releng.aggregator.git
  fi

  assertNotEmpty BUILD_ROOT
  assertNotEmpty AGGREGATOR_REPO
  assertNotEmpty BUILD_TYPE
  assertNotEmpty STREAM

  if [[ -z "${gitCache}" ]]
  then
    gitCache=$( fn-git-cache "${BUILD_ROOT}" )
    assertNotEmpty gitCache
    export gitCache
  else
    echo "gitCache was already defined as $gitCache"
  fi

  if [[ -z "${aggDir}" ]]
  then
    aggDir=$( fn-git-dir "$gitCache" "$AGGREGATOR_REPO" )
    assertNotEmpty aggDir
    export aggDir
  else
    echo "aggDir was already defined as $aggDir"
  fi

# NOTE: if BUILD_ID is already set, we need to make sure it 
# is one of "our" BUILD_IDs,  
# since if we try to run on Hudson, it gets's Hudson's 
# version of BUILD_D which is like "2016-03-13_17-12-03"
# Therefore, we not only check "if set", we also check 
# it's format to be sure it matches the pattern we use.
# We do not expect S or R in this context
# if we ever do, it is a 3 part id, not 2 part.
# Either of the two "digits" forms should work.
#buildIdPattern="^[MNIPY][0-9]{8}-[0-9]{4}$"
buildIdPattern="^[MNIPY][[:digit:]]{8}-[[:digit:]]{4}$"

  if [[ -z "${BUILD_ID}" || ! "${BUILD_ID}" =~ $buildIdPattern ]]
  then
    BUILD_ID=$(fn-build-id "$BUILD_TYPE" )
    assertNotEmpty BUILD_ID
    export BUILD_ID
    echo "BUILD_ID was defined as $BUILD_ID"
  else
   echo "BUILD_ID was already defined as $BUILD_ID"
  fi

  if [[ -z "${buildDirectory}" ]]
  then
    buildDirectory=$( fn-build-dir "$BUILD_ROOT" "$BUILD_ID" "$STREAM" )
    assertNotEmpty buildDirectory
    export buildDirectory
    # this should be when we first create buildDirectory
    echo "Making buildDirectory: ${buildDirectory}"
    # Testing confirmed that umask was correct initially.
    #echo "initial umask in bootstrapVariables.shsource: $(umask)"
    #umask 0002
    #echo "umask after setting in bootstrapVariables.shsource: $(umask)"
    # it appears GID bit is not always set correctly. 
    # Appears related to "depth" of directories made. 
    # If we "cd" to parent directory, then it works. 
    # even using --mode u=rwx,g=rwxs,o=rx did not make it correctly.
    # See https://bugs.eclipse.org/bugs/show_bug.cgi?id=492493
    #mkdir -p --verbose --mode u=rwx,g=rwxs,o=rx  "${buildDirectory}"
    mkdir -p --verbose $BUILD_ROOT/siteDir/eclipse/downloads/drops4
    pushd $BUILD_ROOT/siteDir/eclipse/downloads/drops4
    mkdir --verbose $BUILD_ID
    popd
  else
    echo "buildDirectory was already defined as $buildDirectory"
  fi


