# !/bin/sh

THIS=$0
PROGNAME=`basename ${THIS}`
CUR_DIR=`dirname ${THIS}`
umask 0002
LOCAL_REPOS=false
MILESTONE=false
RELEASE=false
TEST=false
RHB=false
UD2M=false
TARGET=$1
BRANCH=$2
if [ ! "${TARGET}" = "" ]
then
    if [ ! "`echo ${TARGET} | grep '\.test'`" = "" ]
    then
        TARGET=`echo ${TARGET} | cut -d. -f1`
        TEST=true
    fi
    TARG_NM=${TARGET}
else
    TARG_NM="default"
fi
if [ "${TARGET}" = "redhat" ]
then
    RHB=true
    if [ ! "${BRANCH}" = "" ]
    then
        TARGET=${BRANCH}
        BRANCH=
        TARG_NM=${TARGET}
    else
        TARG_NM="default"
        TARGET=
    fi
fi
if [ "${TARGET}" = "milestone" ]
then
    MILESTONE=true
    if [ ! "${BRANCH}" = "" ]
    then
        QUALIFIER=$3
        if [ ! "${QUALIFIER}" = "" ]
        then
            #temporarily store Name of Milestone in TARGET
            #Syntax: ./bootstrap.sh milestone M4 QUALIFIER [branch]
            #  milestone - tells system that it will be promoting a build to a milestone
            #  M4        - an example of the milestone. Used in dir storage, and maven.
            #              Also of note "release" is a special milestone value that tells
            #              the system to promote build to the release for the version.
            #  QUALIFIER - gives the system all the info it needs to identify the build
            #              to promote.
            TARGET=${BRANCH}
            BRANCH=$4
            TARG_NM=${TARGET}
            if [ "${TARGET}" = "release" ]
            then
                RELEASE=true
                TARGET=milestone
            fi
        else
            echo "ERROR: Qualifier of the build must be specified in ARG3!"
            echo "USAGE: ./boostrap.sh milestone M9 QUALIFIER [branch]"
            echo "USAGE: ./boostrap.sh milestone release QUALIFIER [branch]"
            exit
        fi
    else
        echo "ERROR: Name of milestone must be specified in ARG2!"
        echo "USAGE: ./boostrap.sh milestone M9 QUALIFIER [branch]"
        echo "USAGE: ./boostrap.sh milestone release QUALIFIER [branch]"
        exit
    fi
fi
if [ "${TARGET}" = "custom" ]
then
    CUSTOM=true
    if [ ! "${BRANCH}" = "" ]
    then
        CUSTOM_TARG=${BRANCH}
        BRANCH=$3
    else
        echo "ERROR: Name of custom target must be specified in ARG2!"
        echo "USAGE: ./boostrap.sh custom TARGET [branch]"
        exit
    fi
fi
if [ "${TARGET}" = "release" ]
then
    echo "Error: 'release' is not a valid initial target. Use 'milestone release'. Exiting..."
    exit 2
fi
if [ "${TARGET}" = "uploadDeps" ]
then
    UD2M=true
    TARGET=
    TARG_NM=uploadDeps
    if [ ! "${BRANCH}" = "" ]
    then
        BRANCH=
    fi
fi

##-- Convert "BRANCH" to BRANCH_NM (version or trunk) and BRANCH (svn branch path)
#    BRANCH_NM is used for reporting and naming purposes
#    BRANCH    is used to quailify the actual Branch path
if [ ! "${BRANCH}" = "" ]
then
    BRANCH_NM=${BRANCH}
    BRANCH=branches/${BRANCH}/
    JAVA_HOME=/shared/common/ibm-java-ppc64-60-SR7
else
    BRANCH_NM="trunk"
    JAVA_HOME=/shared/rt/eclipselink/sapjvm_6
fi

echo "Target     ='${TARGET}'"
echo "Target name='${TARG_NM}'"
echo "Branch     ='${BRANCH}'"
echo "Branch name='${BRANCH_NM}'"

SVN_EXEC=`which svn`
if [ $? -ne 0 ]
then
    echo "Cannot autofind svn executable. Using default value."
    SVN_EXEC=/usr/local/bin/svn
    if [ ! -f ${SVN_EXEC} ]
    then
        echo "Error finding svn install!"
        exit 1
    fi
fi

# safe temp directory
tmp=${TMPDIR-/tmp}
tmp=$tmp/somedir.$RANDOM.$RANDOM.$RANDOM.$$
(umask 077 && mkdir $tmp) || {
  echo "Could not create temporary directory! Exiting." 1>&2
  exit 1
}
echo "results stored in: '${tmp}'"

#Define common variables
HOME_DIR=/shared/rt/eclipselink
BOOTSTRAP_BLDFILE=bootstrap.xml
UD2M_BLDFILE=uploadDepsToMaven.xml
JAVA_HOME=/shared/common/ibm-java-ppc64-60-SR7
ANT_HOME=/shared/common/apache-ant-1.7.0
LOG_DIR=${HOME_DIR}/logs
BRANCH_PATH=${HOME_DIR}/${BRANCH}trunk
BLD_DEPS_DIR=${HOME_DIR}/bld_deps/${BRANCH_NM}
START_DATE=`date '+%y%m%d-%H%M'`
LOGFILE_NAME=bsb-${BRANCH_NM}_${TARG_NM}_${START_DATE}.log
DATED_LOG=${LOG_DIR}/${LOGFILE_NAME}
JDBC_LOGIN_INFO_FILE=${HOME_DIR}/db-${BRANCH_NM}.dat

#Define build dependency dirs (build needs em, NOT compile dependencies)
JUNIT_HOME=${BLD_DEPS_DIR}/junit
MAVENANT_DIR=${BLD_DEPS_DIR}/mavenant
MAILLIB_DIR=${BRANCH_PATH}/foundation/eclipselink.core.lib

PATH=${JAVA_HOME}/bin:${ANT_HOME}/bin:/usr/bin:/usr/local/bin:${PATH}
OLD_CLASSPATH=${CLASSPATH}
CLASSPATH=${JUNIT_HOME}/junit.jar:${ANT_HOME}/lib/ant-junit.jar:${MAILLIB_DIR}/mail.jar:${MAILLIB_DIR}/activation.jar:${MAVENANT_DIR}/maven-ant-tasks-2.0.8.jar

#------- Subroutines -------#
unset CreatePath
CreatePath() {
    #echo "Running CreateHome!"
    newdir=
    for directory in `echo $1 | tr '/' ' '`
    do
        newdir=${newdir}/${directory}
        if [ ! -d "/${newdir}" ]
        then
            #echo "creating ${newdir}"
            mkdir ${newdir}
            if [ $? -ne 0 ]
            then
                echo "    Create failed!"
                exit
            fi
        fi
    done
}

unset getPrevRevision
getPrevRevision() {
    ## find the revision of the last build
    ##
    for prev_log in `ls -1 ${LOG_DIR} | grep bsb-${BRANCH_NM}_${TARG_NM} | sort -t_ -k3 -r | grep -v ${LOGFILE_NAME}`
    do
        ## exclude "build unnecessary" cb's without effecting other build types
        if [ "`tail ${LOG_DIR}/${prev_log} | grep unnece | tr -d '[:punct:]'`" = "" ]
        then
            PREV_REV=`cat ${LOG_DIR}/${prev_log} | grep revision | grep -m1 svn | cut -d= -f2 | tr -d '\047'`
            break
        fi
    done
}

unset genTestSummary
genTestSummary() {
    infile=$1
    outfile=$2

    if [ -f ${infile} ]
    then
        if [ -n ${infile} ]
        then
            tests=0
            errors=0
            failures=0
            Ttests=0
            Terrors=0
            Tfailures=0
            first_line="true"
            for line in `cat ${infile}`
            do
                if [ "`echo $line | grep 'test-'`" = "" ]
                then
                    # if a test result line, accumulate counts
                    T=`echo $line | cut -d: -f3`
                    E=`echo $line | cut -d: -f7`
                    F=`echo $line | cut -d: -f5`
                    tests=`expr "$tests" + "$T"`
                    errors=`expr "$errors" + "$E"`
                    failures=`expr "$failures" + "$F"`
                    Ttests=`expr "$Ttests" + "$T"`
                    Terrors=`expr "$Terrors" + "$E"`
                    Tfailures=`expr "$Tfailures" + "$F"`
                else
                    # If a header line, and not the first line print totals, next header, and zero out counts
                    if [ ! "$first_line" = "true" ]
                    then
                        echo "  Tests run:${tests} Failures:${failures} Errors:${errors}" >> ${outfile}
                    else
                        first_line="false"
                    fi
                    echo `echo $line | cut -d: -f2 | tr "[:lower:]" "[:upper:]"` >> ${outfile}
                    tests=0; errors=0; failures=0
                fi
            done
            # print out final totals
            if [ ! "$first_line" = "true" ]
            then
                echo "  Tests run:${tests} Failures:${failures} Errors:${errors}" >> ${outfile}
            fi
        else
            echo "Postprocessing Error: No test results to summarize!"
        fi
    fi

    # Return status based upon existence of test success (all pass="true (0)" else="fail (1)")
    if [ \( "$Terrors" -gt 0 \) -o \( "$Tfailures" -gt 0 \) ]
    then
        returncode=1
    else
        returncode=0
    fi
    return $returncode
}

#unset cleanFailuresDir
#cleanFailuresDir() {
#    num_files=10
#
#    # leave only the last 10 failed build logs on the download server
#    index=0
#    for logs in `ls ${FailedNFSDir} | grep log | sort -t_ -k3 -r` ; do
#        index=`expr $index + 1`
#        if [ $index -gt $num_files ] ; then
#            rm -r $logs
#        fi
#    done
#}

#--------- MAIN --------#

#Test for existence of dependencies, send email and fail if any of the above not found.
if [ ! -d ${JAVA_HOME} ]
then
    echo "Java not found!"
    echo "Expecting Java at: ${JAVA_HOME}"
    JAVA_HOME=/shared/common/jdk1.6.0_05
    if [ ! -d ${JAVA_HOME} ]
    then
        echo "Java not found!"
        echo "Expecting Java at: ${JAVA_HOME}"
        exit
    else
        echo "Java found at: ${JAVA_HOME}"
    fi
fi
if [ ! -d ${ANT_HOME} ]
then
    echo "Ant not found!"
    echo "Expecting Ant at: ${ANT_HOME}"
    exit
fi
if [ ! -d ${HOME_DIR} ]
then
    echo "Need to create HOME_DIR (${HOME_DIR})"
    CreatePath ${HOME_DIR}
fi
if [ ! -d ${LOG_DIR} ]
then
    echo "Need to create LOG_DIR (${LOG_DIR})"
    CreatePath ${LOG_DIR}
fi
if [ ! -d ${BLD_DEPS_DIR} ]
then
    echo "Need to create BLD_DEPS_DIR (${BLD_DEPS_DIR})"
    CreatePath ${BLD_DEPS_DIR}
fi
if [ ! -f ${CUR_DIR}/${BOOTSTRAP_BLDFILE} ]
then
    echo "Need bootstrap buildfile (${BOOTSTRAP_BLDFILE}) in the current directory to proceed."
    exit 1
else
    if [ ! "${HOME_DIR}" = "${CUR_DIR}" ]
    then
        cp ${CUR_DIR}/${BOOTSTRAP_BLDFILE} ${HOME_DIR}/${BOOTSTRAP_BLDFILE}
    fi
fi
if [ ! -f $JDBC_LOGIN_INFO_FILE ]
then
    echo "No db Login info available!"
    exit
else
    DB_USER=`cat $JDBC_LOGIN_INFO_FILE | cut -d'*' -f1`
    DB_PWD=`cat $JDBC_LOGIN_INFO_FILE | cut -d'*' -f2`
    DB_URL=`cat $JDBC_LOGIN_INFO_FILE | cut -d'*' -f3`
    DB_NAME=`cat $JDBC_LOGIN_INFO_FILE | cut -d'*' -f4`
fi

#Set appropriate max Heap for VM and let Ant inherit JavaVM (OS's) proxy settings
ANT_ARGS=" "
ANT_OPTS="-Xmx512m"
ANT_BASEARG="-f \"${BOOTSTRAP_BLDFILE}\" -Dbranch.name=\"${BRANCH}\""

# Test for "milestone" flag to start a build promotion rather than a real build
if [ "${MILESTONE}" = "true" ]
then
    ## Parse $QUALIFIER for build date value
    BLDDATE=`echo ${QUALIFIER} | cut -s -d'-' -f1 | cut -s -dv -f2`
    if [ "${BLDDATE}" = "" ]
    then
        echo "BLDDATE Error: There is something wrong with QUALIFIER. ('$QUALIFIER' should be vDATE-rREV)!"
        exit 2
    fi

    ## Parse $QUALIFIER for SVN revision value
    SVNREV=`echo ${QUALIFIER} | cut -s -d'-' -f2 | cut -s -dr -f2`
    if [ "${SVNREV}" = "" ]
    then
        echo "SVNREV Error: There is something wrong with QUALIFIER. ('$QUALIFIER' should be vDATE-rREV)!"
        exit 2
    fi

    # Setup parameters for Ant build
    ANT_BASEARG="${ANT_BASEARG} -Dsvn.revision=${SVNREV} -Dbuild.date=${BLDDATE}"
    if [ "${RELEASE}" = "true" ]
    then
        ANT_BASEARG="${ANT_BASEARG} -Dbuild.type=RELEASE"
    else
        ANT_BASEARG="${ANT_BASEARG} -Dbuild.type=${TARGET}"
    fi
    TARGET=milestone
fi

if [ "${LOCAL_REPOS}" = "true" ]
then
    ANT_BASEARG="${ANT_BASEARG} -D_LocalRepos=1"
fi

if [ "${RHB}" = "true" ]
then
    #Only needed for dev behind firewall
    ANT_OPTS="-Dhttp.proxyHost=www-proxy.us.oracle.com ${ANT_OPTS}"
    ANT_ARGS="-autoproxy"
    ANT_BASEARG="${ANT_BASEARG} -D_RHB=1"
fi

if [ "${TEST}" = "true" ]
then
    ANT_BASEARG="${ANT_BASEARG} -D_NoUpdateSrc=1"
fi

if [ "${UD2M}" = "true" ]
then
    ANT_BASEARG="-f \"${UD2M_BLDFILE}\" -Dbranch.name=\"${BRANCH}\" -D_NoUpdateSrc=1"
fi

if [ "${CUSTOM}" = "true" ]
then
    ANT_BASEARG="${ANT_BASEARG} -Dcustom.target=\"${CUSTOM_TARG}\""
fi

export ANT_ARGS ANT_OPTS ANT_HOME BRANCH_PATH HOME_DIR LOG_DIR JAVA_HOME JUNIT_HOME MAVENANT_DIR PATH CLASSPATH
export SVN_EXEC BLD_DEPS_DIR JUNIT_HOME TARGET BRANCH_NM

cd ${HOME_DIR}
echo "Results logged to: ${DATED_LOG}"
touch ${DATED_LOG}

echo "Cleaning the db for build..."
echo "Cleaning the db for build..." >> ${DATED_LOG}
echo "drop schema ${DB_NAME};" > sql.sql
echo "create schema ${DB_NAME};" >> sql.sql
mysql -u${DB_USER} -p${DB_PWD} < sql.sql
rm sql.sql
echo "done."
echo "done." >> ${DATED_LOG}

echo "Build starting..."
echo "Build started at: `date`" >> ${DATED_LOG}
#source ~/.ssh-agent >> ${DATED_LOG} 2>&1
echo "ant ${ANT_BASEARG} ${TARGET}" >> ${DATED_LOG}
ant ${ANT_BASEARG} -Ddb.user="${DB_USER}" -Ddb.pwd="${DB_PWD}" -Ddb.url="${DB_URL}" ${TARGET} >> ${DATED_LOG} 2>&1
echo "Build completed at: `date`" >> ${DATED_LOG}
echo "Build complete."

# If promoting a build just exit. there is no post-build processing
if [ \( "${MILESTONE}" = "true" \) -o \( "${CUSTOM}" = "true" \) ]
then
    exit
fi
##  ---------------------------------------- ####### ------------------------------------  ##
echo "Post-build Processing Starting..."
## Post-build Processing
##
MAIL_EXEC=/bin/mail
MAILFROM=eric.gwin@oracle.com
MAILLIST="ejgwin@gmail.com"
SUCC_MAILLIST="eric.gwin@oracle.com edwin.tang@oracle.com"
FAIL_MAILLIST="eclipselink-dev@eclipse.org ejgwin@gmail.com"
PARSE_RESULT_FILE=${tmp}/raw-summary.txt
COMPILE_RESULT_FILE=${tmp}/compile-error-summary.txt
SORTED_RESULT_FILE=${tmp}/sorted-summary.txt
TESTDATA_FILE=${tmp}/testsummary-${BRANCH_NM}_${TARG_NM}.txt
SVN_LOG_FILE=${tmp}/svnlog-${BRANCH_NM}_${TARG_NM}.txt
MAILBODY=${tmp}/mailbody-${BRANCH_NM}_${TARG_NM}.txt
FailedNFSDir="/home/data/httpd/download.eclipse.org/rt/eclipselink/recent-failure-logs"
BUILD_FAILED="false"
TESTS_FAILED="false"

#set -x
## Verify Build Started before bothering with setting up for an email or post-processing
## if [ not "build unnecessary"  ] - (if build wasn't aborted due to no changes)
##
if [ "`tail ${DATED_LOG} | grep unnece | tr -d '[:punct:]'`" = "" ]
then
    ## find the current version (cannot use $BRANCH, because need current version stored in ANT buildfiles)
    ##
    VERSION=`cat ${DATED_LOG} | grep -m1 "EL version" | cut -d= -f2 | tr -d '\047'`
    BUILD_STR=`cat ${DATED_LOG} | grep -m1 version.string | cut -d= -f2 | tr -d '\047'`
    echo "Generating summary email for ${VERSION} build '${BUILD_STR}'."

    ## find the current revision
    ##
    CUR_REV=`cat ${DATED_LOG} | grep revision | grep -m1 svn | cut -d= -f2 | tr -d '\047'`

    ## find the revision of the last build
    ##
    getPrevRevision
    if [ ! "$PREV_REV" = "" ]
    then
        ## Include everything but the revision of the last build (jump 1 up from it)
        PREV_REV=`expr "${PREV_REV}" + "1"`
        ## Prepend the ":" for the "to" syntax of the "svn log" command
        PREV_REV=:${PREV_REV}
    fi
    echo "  changes included are from current revision to earliest not previously built (${CUR_REV}:${PREV_REV}) inclusive."

    ## Generate transaction log for this revision
    ##
    svn log -r ${CUR_REV}${PREV_REV} -q -v  svn+ssh://dev.eclipse.org/svnroot/rt/org.eclipse.persistence/${BRANCH}trunk >> ${SVN_LOG_FILE}

    ## Verify Compile complete before bothering with post-build processing for test results
    ## if [ not build failed ]
    ##
    if [ ! "`tail ${DATED_LOG} | grep 'BUILD SUCCESSFUL'`" = "" ]
    then
        ## Ant log preprocessing to generate test results files
        ##
        cat ${DATED_LOG} | grep -n '^test-' | grep -v "\-jar" | grep -v "\-errors:" | grep -v lrg | grep -v t-srg | tr -d ' ' > ${PARSE_RESULT_FILE}
        cat ${DATED_LOG} | grep -n 'Errors: [0-9]' | tr -d ' ' | tr ',' ':' >> ${PARSE_RESULT_FILE}
        cat ${PARSE_RESULT_FILE} | sort -n -t: > ${SORTED_RESULT_FILE}

        ## Capture any 'allowed' compiler errors
        ##
        cat ${DATED_LOG} | grep -n '[javac]*errors' > ${COMPILE_RESULT_FILE}

        ## make sure TESTDATA_FILE is empty
        ##
        if [ -f ${TESTDATA_FILE} ]
        then
            rm -f ${TESTDATA_FILE}
        fi
        touch ${TESTDATA_FILE}

        ## postpend notification if signing failed
        if [ ! "`cat ${DATED_LOG} | grep 'SigningAborted'`" = "" ]
        then
            CAVEAT_TXT=" Signing failed. P2 not generated!"
        fi

        ## run routine to generate test results file and generate MAIL_SUBJECT based upon exit status
        ##
        genTestSummary ${SORTED_RESULT_FILE} ${TESTDATA_FILE}
        if [ $? -eq 0  ]
        then
            MAIL_SUBJECT="${BRANCH_NM} ${TARG_NM} build complete.${CAVEAT_TXT}"
            MAILLIST=${SUCC_MAILLIST}
        else
            MAIL_SUBJECT="${BRANCH_NM} ${TARG_NM} build has test failures!${CAVEAT_TXT}"
            TESTS_FAILED="true"
        fi

    else
        MAIL_SUBJECT="${BRANCH_NM} ${TARG_NM} build failed!"
        BUILD_FAILED="true"
    fi

    if [ "${TESTS_FAILED}" = "true" ]
    then
        echo "Build had Test issues that need to be resolved."
        LOGPREFIX=TestFail
        if [ "${TARG_NM}" = "cb" ]
        then
            # Zip up test results and copy them to appropriate location
            ant ${ANT_BASEARG} -Dtest.result.dest.dir="${FailedNFSDir}" -Dtest.result.zip="TestResult_-${BRANCH_NM}_${TARG_NM}_${START_DATE}.zip" save-tst-results
            echo "Command to zip and copy test results"
            echo "   ant ${ANT_BASEARG} -Dtest.result.dest.dir="${FailedNFSDir}" -Dtest.result.zip="TestResult_-${BRANCH_NM}_${TARG_NM}_${START_DATE}.zip" save-tst-results"
       fi
    fi

    if [ "${BUILD_FAILED}" = "true" ]
    then
        LOGPREFIX=BuildFail
        echo "Build had issues to be resolved."
    fi

    if [ \( "${BUILD_FAILED}" = "true" \) -o \( "${TESTS_FAILED}" = "true" \) ]
    then
        cp ${DATED_LOG} ${FailedNFSDir}/${LOGPREFIX}${LOGFILE_NAME}
        MAILLIST=${FAIL_MAILLIST}
        echo "Updating 'failed build' site..."
        chmod 755 ${BRANCH_PATH}/buildsystem/buildFailureList.sh
        ${BRANCH_PATH}/buildsystem/buildFailureList.sh
    fi

    ## Build Body text of email
    ##
    if [ -f ${MAILBODY} ]; then rm ${MAILBODY}; fi
    echo "Build summary for ${BUILD_STR}" > ${MAILBODY}
    echo "-----------------------------------" >> ${MAILBODY}
    echo "Non-critical compilation issues (if any) repoted in" >> ${MAILBODY}
    echo "the format [BUILDLOG_LINE#: NUMBER_OF_ERRORS]:" >> ${MAILBODY}
    cat ${COMPILE_RESULT_FILE} >> ${MAILBODY}
    echo "-----------------------------------" >> ${MAILBODY}
    if [ \( -f ${TESTDATA_FILE} \) -a \( -n ${TESTDATA_FILE} \) ]
    then
        cat ${TESTDATA_FILE} >> ${MAILBODY}
        echo "-----------------------------------" >> ${MAILBODY}
        echo "" >> ${MAILBODY}
        rm ${TESTDATA_FILE}
    else
        touch ${MAILBODY}
    fi
    echo "Build log: (${DATED_LOG})" >> ${MAILBODY}
    if [ \( "${BUILD_FAILED}" = "true" \) -o \( "${TESTS_FAILED}" = "true" \) ]
    then
        if [ \( ! "${TARG_NM}" = "cb" \) -a \( "${TESTS_FAILED}" = "true" \) ]
        then
            echo "Test logs can be found on the download server at:" >> ${MAILBODY}
            echo "    http://www.eclipse.org/eclipselink/downloads/nightly.php" >> ${MAILBODY}
        fi
        echo "Build logs can be found on the download server at:" >> ${MAILBODY}
        echo "    http://www.eclipse.org/eclipselink/downloads/build-failures.php" >> ${MAILBODY}
    fi
    echo "-----------------------------------" >> ${MAILBODY}
    echo "" >> ${MAILBODY}
    echo "SVN Changes since Last Build:" >> ${MAILBODY}
    cat ${SVN_LOG_FILE} >> ${MAILBODY}

    ## Send result email
    ##
    echo "Sending email..."
    cat ${MAILBODY} | ${MAIL_EXEC} -r ${MAILFROM} -s "BUILD STATUS:: ${MAIL_SUBJECT}" ${MAILLIST}
    if [ $? -eq 0  ]
    then
       echo "     complete."
    else
       echo "     failed."
    fi
else
    echo "Build was aborted...   Post-Processing unecessary."
    if [ "`cat ${DATED_LOG} | grep -n  -m1 env.TARGET |  cut -d= -f2 | tr -d '\047' | tr -d ' '`" = "nightly" ]
    then
        if [ -f ${MAILBODY} ]; then rm ${MAILBODY}; fi
        echo "Because no changes to the repository were detected." > ${MAILBODY}
        echo " " >> ${MAILBODY}
        echo "The build log can be found at: ${DATED_LOG}" >> ${MAILBODY}
        MAIL_SUBJECT="${BRANCH_NM} ${TARG_NM} build aborted."
        MAILLIST=${SUCC_MAILLIST}
        echo "Sending 'Nightly Aborted' email..."
        cat ${MAILBODY} | ${MAIL_EXEC} -r ${MAILFROM} -s "BUILD STATUS:: ${MAIL_SUBJECT}" ${MAILLIST}
    fi
fi

## Remove tmp directory
##
rm -rf $tmp
echo "Post-build Processing Complete."

CLASSPATH=${OLD_CLASSPATH}
