#!/bin/sh
# If an option is given to this script, it is assumed as running in
# sanity check mode


# Define the Java versions that we will use to perform the build.
# These values should correspond to subdirectories below /java
JAVA_VERSIONS="jdk5 jdk6"


# Define absolute paths to all commands we will use in this script.
AWK=/usr/bin/awk
CAT=/usr/bin/cat
CHMOD=/usr/bin/chmod
CUT=/usr/bin/cut
DATE=/usr/bin/date
DIRNAME=/usr/bin/dirname
GREP=/usr/bin/grep
GZIP=/usr/bin/gzip
HEAD=/usr/bin/head
LN=/usr/bin/ln
LS=/usr/bin/ls
MKDIR=/usr/bin/mkdir
MKTEMP=/usr/bin/mktemp
MV=/usr/bin/mv
RM=/usr/bin/rm
SORT=/usr/bin/sort
SVN=/opt/csw/bin/svn
TAR=/usr/bin/tar
TEST=/usr/bin/test
WC=/usr/bin/wc
SENDMAIL=/export/home/builds/bin/send-mail.sh

#If an argument is provided, let's assume we run a sanity check (no mail)
if ${TEST} $# -gt 0
then
  SANITY=1
else
  SANITY=0
fi

# Change to the directory that contains this script.
cd `${DIRNAME} $0`


# Explicitly set a minimal PATH so we don't run anything unexpected.
PATH="/bin:/usr/bin"
export PATH


# Define paths that will be used during this script.
SCRIPT_DIR=`pwd`
BUILDS_DIR=/daily-builds/tests


# Define the URL to use to access the repository.
SVN_URL=file:///svn-mirror/trunk/opends


# Define variables that will be used when sending the e-mail message.
#RECIPIENT="opends-staff@sun.com"
#RECIPIENT="dev@opends.dev.java.net"
RECIPIENT="carole.hebrard@sun.com"
SENDER="opends@dev.java.net"
SUBJECT_DATE=`${DATE} '+%Y%m%d'`
SUBJECT="OpenDS Daily Build ${SUBJECT_DATE}"


# Create a new directory to hold the build.
BUILD_DATE=`${DATE} '+%Y%m%d%H%M%S'`
BUILD_DIR="${BUILDS_DIR}/${BUILD_DATE}"
${MKDIR} -p ${BUILD_DIR}


# Start generating a log file for the build.
LOG_FILE="${BUILD_DIR}/build-${BUILD_DATE}.log"
#SERVER_NAME="www2.opends.org"
SERVER_NAME="www.opends.org"
BUILD_URL="http://${SERVER_NAME}/daily-builds/${BUILD_DATE}/"
echo "OpenDS Daily Build ${SUBJECT_DATE}" > ${LOG_FILE}
echo "Build Time:  ${BUILD_DATE}" >> ${LOG_FILE}
echo "Build URL:   ${BUILD_URL}" >> ${LOG_FILE}
echo >> ${LOG_FILE}
echo >> ${LOG_FILE}


# Check out the head revision from the repository.
cd ${BUILD_DIR}
echo ${SVN} checkout -q --non-interactive ${SVN_URL} OpenDS >> ${LOG_FILE} 2>&1
${SVN} checkout -q --non-interactive ${SVN_URL} OpenDS >> ${LOG_FILE} 2>&1
echo >> ${LOG_FILE}
echo >> ${LOG_FILE}


# Add information about the checked-out revision to the log.
cd OpenDS
echo ${SVN} info >> ${LOG_FILE} 2>&1
${SVN} info >> ${LOG_FILE} 2>&1
echo >> ${LOG_FILE}
echo >> ${LOG_FILE}


# jp146654 :add path to OpenDMK
cd ${BUILD_DIR}/OpenDS

OLD_BUILDPROP_FILE=build.properties.origin
NEW_BUILDPROP_FILE=build.properties
echo update Opendmk lib path in OpenDS/build.properties>> ${LOG_FILE} 2>&1
echo cp ${NEW_BUILDPROP_FILE} ${NEW_BUILDPROP_FILE}.origin >> ${LOG_FILE} 2>&1
cp ${NEW_BUILDPROP_FILE} ${NEW_BUILDPROP_FILE}.origin

echo add new path   : /export/home/builds/OpenDMK-bin/lib>> ${LOG_FILE} 2>&1
${CAT}  ${OLD_BUILDPROP_FILE} | sed "s/opendmk\.lib\.dir\=/opendmk\.lib\.dir\=\/export\/home\/builds\/OpenDMK-bin\/lib/g" > ${NEW_BUILDPROP_FILE}

echo >> ${LOG_FILE}
echo >> ${LOG_FILE}
# end


# Parse the PRODUCT file to get the version information.
SHORT_NAME=`${GREP} SHORT_NAME PRODUCT | ${CUT} -d= -f2`
MAJOR_VERSION=`${GREP} MAJOR_VERSION PRODUCT | ${CUT} -d= -f2`
MINOR_VERSION=`${GREP} MINOR_VERSION PRODUCT | ${CUT} -d= -f2`
POINT_VERSION=`${GREP} POINT_VERSION PRODUCT | ${CUT} -d= -f2`
VERSION_QUALIFIER=`${GREP} VERSION_QUALIFIER PRODUCT | ${CUT} -d= -f2`
VERSION_NUMBER_STRING="${MAJOR_VERSION}.${MINOR_VERSION}.${POINT_VERSION}${VERSION_QUALIFIER}"
VERSION_STRING="${SHORT_NAME}-${VERSION_NUMBER_STRING}"


# Loop through the JDK versions and build usin gthe "nightly" target.
# We'll set JAVA_HOME each time, and when we're done, we can continue using
# the last one.
ANY_FAILED=0
ALL_FAILED=1
for VERSION in ${JAVA_VERSIONS}
do
  # Removes directory that might be still there if test failed before
  # @AfterClass that normaly performs the cleanup
  FSCACHE=/tmp/OpenDS.FSCache
  if ${TEST} -d FSCACHE
  then
    ${RM} -rf ${FSCACHE}
  fi


  JAVA_HOME=/java/${VERSION}
  export JAVA_HOME

  echo "Building with Java version ${VERSION}" >> ${LOG_FILE}
  echo ./build.sh nightly svr4 -Ddisable.test.help=true -DMEM=512M >> ${LOG_FILE} 2>&1
  ./build.sh nightly svr4 -Ddisable.test.help=true -DMEM=512M >> ${LOG_FILE} 2>&1


  if ${TEST} $? -eq 0
  then
    ALL_FAILED=0
  else
    ANY_FAILED=1
  fi

  # Create the Java Web Start install archive.
  ADDRESS="www.opends.org"
  export ADDRESS
  BASE_PATH=/daily-builds/latest/OpenDS/build/webstart/install
  export BASE_PATH
  echo resource/webstart/create-webstart-standalone.sh >> ${LOG_FILE} 2>&1
  resource/webstart/create-webstart-standalone.sh >> ${LOG_FILE} 2>&1
  # fix to make create-webstart-standalone.sh support jdk5 and jdk6
  NEW_QUICKSETUP_FILE=`${MKTEMP}`
  JWS_QUICKSETUP_FILE=build/webstart/install/QuickSetup.jnlp
  cat ${JWS_QUICKSETUP_FILE} | sed "s/\/build\//\/build.${VERSION}\//g" > ${NEW_QUICKSETUP_FILE}
  mv ${JWS_QUICKSETUP_FILE} ${JWS_QUICKSETUP_FILE}.moved
  mv ${NEW_QUICKSETUP_FILE} ${JWS_QUICKSETUP_FILE}
  ${CHMOD} +r ${JWS_QUICKSETUP_FILE}

  echo >> ${LOG_FILE}
  echo >> ${LOG_FILE}

  ${MV} build build.${VERSION}
done

#If this is a sanity check, exit
if ${TEST} ${SANITY} -eq 1
then
  exit 1
fi

# Create a README.html file in for this build.
cat > ${BUILD_DIR}/README.html <<ENDOFREADME
<TABLE BORDER="0">
  <TR>
    <TD>
      <IMG SRC="http://${SERVER_NAME}/images/opends_logo_welcome.png" ALT="OpenDS Logo" WIDTH="197" HEIGHT="57">
    </TD>

    <TD>
      <H2>OpenDS Daily Build ${SUBJECT_DATE}</H2>
      <A HREF="${BUILD_URL}build-${BUILD_DATE}.log">Build Log File</A>
ENDOFREADME

for VERSION in ${JAVA_VERSIONS}
do
cat >> ${BUILD_DIR}/README.html <<ENDOFREADME
      <BR>
      <B>Build with Java Version ${VERSION}</B>
      <A HREF="${BUILD_URL}OpenDS/build.${VERSION}/package/${VERSION_STRING}.zip">${VERSION_STRING}.zip Build Package File</A><BR>
      <A HREF="${BUILD_URL}OpenDS/build.${VERSION}/package/${VERSION_STRING}-DSML.war">${VERSION_STRING}-DSML.war DSML Gateway</A><BR>
      <A HREF="${BUILD_URL}OpenDS/build.${VERSION}/webstart/install/QuickSetup.jnlp">QuickSetup Java Web Start Installer</A><BR>
      <A HREF="${BUILD_URL}OpenDS/build.${VERSION}/javadoc/">Javadoc Documentation</A><BR>
      <A HREF="${BUILD_URL}OpenDS/build.${VERSION}/src.zip">src.zip Source Archive</A><BR>
      <A HREF="${BUILD_URL}OpenDS/build.${VERSION}/unit-tests/report/results.txt">Unit Test Report</A><BR>
      <A HREF="${BUILD_URL}OpenDS/build.${VERSION}/coverage/reports/unit/">Unit Test Code Goverage Report</A><BR>
ENDOFREADME
done

cat >> ${BUILD_DIR}/README.html <<ENDOFREADME
    </TD>
  </TR>
</TABLE>
ENDOFREADME


# Remove the "latest" symlink (if it exists) and recreate it pointing to
# the new build.
cd ${BUILDS_DIR}
${RM} -f latest
${LN} -s ${BUILD_DIR} ${BUILDS_DIR}/latest


# Remove an old directory if appropriate.  We want to keep up to 30 builds.
COUNT=`${LS} | ${SORT} | ${GREP} -v latest | ${WC} -l | ${AWK} '{print $1}'`
if ${TEST} ${COUNT} -gt 30
then
  OLDEST=`${LS} | ${SORT} | ${GREP} -v latest | ${HEAD} -1`
  ${RM} -rf ${OLDEST}
fi


# Send an e-mail message to indicate that the build is complete.
BODY_FILE=`${MKTEMP}`
echo "OpenDS Daily Build ${SUBJECT_DATE}" > ${BODY_FILE}
echo "Java Versions Tested:  ${JAVA_VERSIONS}" >> ${BODY_FILE}

if ${TEST} ${ANY_FAILED} -eq 0
then
  echo "Build Status:  Succeeded for all Java versions" >> ${BODY_FILE}
  SUBJECT_WITH_STATUS="${SUBJECT} (success)"
else
  if ${TEST} ${ALL_FAILED} -eq 0
  then
    echo "Build Status:  Failed for some Java versions" >> ${BODY_FILE}
  else
    echo "Build Status:  Failed for all Java versions" >> ${BODY_FILE}
  fi
  SUBJECT_WITH_STATUS="${SUBJECT} (failure)"
fi

echo "Build URL:  ${BUILD_URL}" >> ${BODY_FILE}

${SENDMAIL} --from "${SENDER}" --to "${RECIPIENT}" --subject "${SUBJECT_WITH_STATUS}" \
            --body "${BODY_FILE}" --attach "${BUILD_DIR}/README.html" \
            --attach "${LOG_FILE}"

${RM} ${BODY_FILE}

