#!/bin/bash

# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to you under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# ${TOOLDIR}/buildDerby [MKBUILDZIP] [ANTPROPFILE]
#
# if "ZipJars"..:
MKBUILDZIP=$1
#
ANTPROPFILE=$2

# You might want to modify:
# NOT USED ANY MORE. MYWORKSTATION=atum02.norway.sun.com

# You should NOT need to modify anything below.
# derby_source must be defined.
# NB: Assumes . ./env.sh is done to set JAVA_HOME etc. correctly.
#---------------------------------------------
TOOLDIR="${DERBYDIR}/${BRANCH_DIR}/tools/testing/reporting/scripts"
. ${TOOLDIR}/env

SRCDIR=${derby_source}

if [ ! -e ${SRCDIR} ]
then
    echo "${SRCDIR} does not exist."
    exit
fi

# GETHOSTNAME="host"
GETHOSTNAME="echo"

rm -f ${BUILDLOGDIR}/buildOK

SANDBOX=`basename ${DERBYDIR}`

UPDATELOGDIR=${DERBYDIR}/UpdateLog
if [ ! -e ${UPDATELOGDIR}/updateOK ]
then
  echo "Derby was NOT updated:"
  echo "  ${UPDATELOGDIR}/updateOK does not exist."
  ### UNCOMMENT TO SEND MAIL. ${TOOLDIR}/textMail "${SANDBOX} was NOT updated" "${MAILTOINT}" "${UPDATELOGDIR}/update.out"
  exit
fi

BUILDID=`date +%Y-%m-%d_%H-%M-%S`
STARTTIME=`date +%Y-%m-%d" "%H:%M:%S`
BUILDLOGDIRCUR=${BUILDLOGDIR}/${BUILDID}
mkdir -p ${BUILDLOGDIRCUR}
if [ ! -e ${BUILDLOGDIRCUR} ]
then
    echo "${BUILDLOGDIRCUR} does not exist."
    exit
fi

BUILDINFO=${BUILDLOGDIRCUR}/info
PUBLISHBUILDINFO=${BUILDLOGDIRCUR}/buildInfo
BUILDDETAILS=${BUILDLOGDIRCUR}/buildDetails
BUILDHOSTINFO=`uname -srpi`
BUILDHOST=`uname -n`
BUILDHOST=`${GETHOSTNAME} ${BUILDHOST} | awk '{print $1}'`
cd ${SRCDIR}

REVISION=`svn info | grep '^Revision:'`
REVISION=`echo ${REVISION} | gawk '{ print $2 }'`
REPOSITORY=`svn info | grep '^URL:'`

echo "Built on ${BUILDHOSTINFO}[${BUILDHOST}] at ${STARTTIME}" \
                                                  > ${BUILDINFO}
echo "Using Revision: ${REVISION} from ${REPOSITORY}"      >> ${BUILDINFO}
echo "ANT_HOME:  ${ANT_HOME}"                    >> ${BUILDINFO}
echo "JAVA_HOME: ${JAVA_HOME}"                   >> ${BUILDINFO}

# Build information for publishing along with build jars:
echo "Build information:"                    >  ${PUBLISHBUILDINFO}
echo "OS: ${BUILDHOSTINFO}"                  >> ${PUBLISHBUILDINFO}
echo "JAVA_HOME: ${JAVA_HOME}"               >> ${PUBLISHBUILDINFO}
echo "JDK: ${JAVA_HOME}/bin/java -version :" >> ${PUBLISHBUILDINFO}
${JAVA_HOME}/bin/java -version               >> ${PUBLISHBUILDINFO} 2>${PUBLISHBUILDINFO}.err 
cat ${PUBLISHBUILDINFO}.err                  >> ${PUBLISHBUILDINFO}

# ssh ${MYWORKSTATION} "cd ${SRCDIR}; svn status" > ${BUILDLOGDIRCUR}/localChanges
svn status > ${BUILDLOGDIRCUR}/localChanges

echo "-------------------- ant" > ${BUILDDETAILS}
# Set ant property file if NOT given as second param.
if [ "${ANTPROPFILE}" == "" ]
then
  ANTPROPFILE=${HOME}/ant.properties
fi
echo "${ANTPROPFILE}:"  >> ${BUILDDETAILS}
cat ${ANTPROPFILE} >> ${BUILDDETAILS}

echo " Build details in: ${BUILDDETAILS}"
echo "-------------------- ant clobber" \
                     >> ${BUILDDETAILS} && \
ant -propertyfile ${ANTPROPFILE} clobber          >> ${BUILDDETAILS} 2>> ${BUILDDETAILS} && \
echo ""              >> ${BUILDDETAILS} && \
echo "-------------------- ant all" \
                     >> ${BUILDDETAILS} && \
ant -propertyfile ${ANTPROPFILE} all              >> ${BUILDDETAILS} 2>> ${BUILDDETAILS} && \
echo ""              >> ${BUILDDETAILS} && \
echo "-------------------- ant buildjars" \
                     >> ${BUILDDETAILS} && \
ant -propertyfile ${ANTPROPFILE} buildjars        >> ${BUILDDETAILS} 2>> ${BUILDDETAILS}

ENDTIME=`date +%Y-%m-%d" "%H:%M:%S`
echo "[Build ended ${ENDTIME},"   >> ${BUILDINFO}
echo "     started ${STARTTIME}]" >> ${BUILDINFO}
rm -f ${BUILDLOGDIR}/lastBuildInfo
cp ${BUILDINFO} ${BUILDLOGDIR}/lastBuildInfo
grep "rrors " ${BUILDDETAILS} >> ${BUILDLOGDIR}/lastBuildInfo
grep "BUILD" ${BUILDDETAILS} >> ${BUILDLOGDIR}/lastBuildInfo

BUILDS="${DERBYDIR}/testing/builds"
# Flag that building went OK:
if [ -e ${BUILDLOGDIR}/${BUILDID}/buildDetails ]
then
  if [ "`grep "BUILD SUCCESSFUL" ${BUILDLOGDIR}/${BUILDID}/buildDetails | wc -l | gawk '{ print $1 }'`" == "3" ] && \
     [ "`grep "BUILD FAILED"     ${BUILDLOGDIR}/${BUILDID}/buildDetails | wc -l | gawk '{ print $1 }'`" == "0" ]
  then
    echo "touch ${BUILDLOGDIR}/buildOK"
    touch ${BUILDLOGDIR}/buildOK

    # We're in ${SRCDIR}
    ${TOOLDIR}/calcJarFootprint > ${BUILDS}/${REVISION}.size
    chmod go+r ${BUILDS}/${REVISION}.size
    # Publish externally:
    SRC="${BUILDS}/${REVISION}.size"
    DST="${PUBLISHDIR}/builds/${REVISION}.size"
    echo "**** OBS! ${SCPUT} ${SRC} ${PUBLISHUSER}@${PUBLISHSITE}:${DST}"
    ${SCPUT} ${SRC} ${PUBLISHUSER}@${PUBLISHSITE}:${DST}
    
    SUBJECT="Derby build OK - ${REVISION} ${SANDBOX}"

    SHOWBUILDERRORS=""
    if [ "`grep "errors" ${BUILDLOGDIR}/${BUILDID}/buildDetails | grep "\[javac\]" | wc -l | gawk '{ print $1 }'`" != "0" ]
    then
        SUBJECT="WARNING! There were build ERRORs! - ${REVISION} ${SANDBOX}"
        SHOWBUILDERRORS="${BUILDLOGDIR}/${BUILDID}/buildDetails"
        echo "touch ${BUILDLOGDIR}/buildERRORS"
        touch ${BUILDLOGDIR}/buildERRORS

        cp ${BUILDLOGDIR}/${BUILDID}/buildDetails ${DERBYDIR}/testing/UpdateInfo/${REVISION}-buildDetails

        SEDSCR="'s:${DERBYDIR}/::'"
        SEDCMD="sed -e ${SEDSCR} ${DERBYDIR}/testing/UpdateInfo/${REVISION}-buildDetails "
        echo ${SEDCMD} > sedCmd$$
        . ./sedCmd$$ \
                   > ${DERBYDIR}/testing/UpdateInfo/${REVISION}-buildDetails.txt
        rm sedCmd$$

        rm ${DERBYDIR}/testing/UpdateInfo/${REVISION}-buildDetails
        chmod go+r ${DERBYDIR}/testing/UpdateInfo/${REVISION}-buildDetails.txt
    fi

    # Do an execution check, and get the sysinfo for use in test reports.
    java -cp ${SRCDIR}/classes org.apache.derby.tools.sysinfo > ${BUILDLOGDIR}/${BUILDID}/sysinfo.txt 2> ${BUILDLOGDIR}/${BUILDID}/sysinfo.err
    cp ${BUILDLOGDIR}/${BUILDID}/sysinfo.txt ${BUILDLOGDIR}/currentSysInfo.txt

    # Include ${DERBYDIR}/testing/UpdateInfo/${REVISION}.txt (created by updateDerby) in mails 
    # REVISION=`echo ${REVISION} | gawk '{ print $2 }'`
    REVUPDATE="${DERBYDIR}/testing/UpdateInfo/${REVISION}.txt"
    ### UNCOMMENT TO SEND MAIL. ${TOOLDIR}/textMail "${SUBJECT}" "${MAILTOINT}" "${BUILDLOGDIR}/lastBuildInfo ${BUILDLOGDIR}/${BUILDID}/sysinfo.txt ${SHOWBUILDERRORS} ${REVUPDATE}"
    ### UNCOMMENT TO SEND MAIL.  ${TOOLDIR}/textMail "${SUBJECT}" "${MAILTOEXT}" "${BUILDLOGDIR}/lastBuildInfo ${BUILDLOGDIR}/${BUILDID}/sysinfo.txt ${SHOWBUILDERRORS} ${REVUPDATE}"
    mv ${BUILDLOGDIR}/${BUILDID} ${BUILDLOGDIR}/${REVISION}
    # Observe that e.g. PUBLISHBUILDINFO will no longer be valid: correct def.:
    PUBLISHBUILDINFO="${BUILDLOGDIR}/${REVISION}/buildInfo"

  if [ "${MKBUILDZIP}" == "ZipJars" ]
  then
    # Zip the jars
    echo "${DERBYDIR}/BuildLog/${REVISION}/sysinfo.txt"
    ls -al ${DERBYDIR}/BuildLog/${REVISION}
    DERBYVERSION=`grep "/classes] " ${DERBYDIR}/BuildLog/${REVISION}/sysinfo.txt | gawk -F] '{ print $2 }' | gawk '{ print $1$2 }'`
    cd ${SRCDIR}/jars/insane/
    ZIPPEDJARS="Derby${DERBYVERSION}_${BUILDID}-SVN${REVISION}.zip"
    # Copy COPYRIGHT, LICENSE, NOTICE to ${SRCDIR}/jars/insane/ (current dir.) to show them on outermost level in .zip file
    cp ${SRCDIR}/jars/insane/lists/META-INF/COPYRIGHT ./COPYRIGHT
    cp ${SRCDIR}/jars/insane/lists/META-INF/LICENSE   ./LICENSE
    cp ${SRCDIR}/jars/insane/lists/META-INF/NOTICE    ./NOTICE 
    chmod a+r COPYRIGHT LICENSE NOTICE 
    echo "zip -r -q -9  ${BUILDS}/${ZIPPEDJARS} ."
    zip -r -q -9  ${BUILDS}/${ZIPPEDJARS} .
    chmod a+r ${BUILDS}/${ZIPPEDJARS}
    # Transfer the .zip file to ISP:
    SRC="${BUILDS}/${ZIPPEDJARS}"
    DST="${PUBLISHDIR}/builds/${ZIPPEDJARS}"
    ## echo "**** OBS! ${SCPUT} ${SRC} ${PUBLISHUSER}@${PUBLISHSITE}:${DST}"
    ## ${SCPUT} ${SRC} ${PUBLISHUSER}@${PUBLISHSITE}:${DST}

    # Handle the html page describing builds
    cd ${BUILDS}

    # Copy COPYRIGHT, LICENSE, NOTICE to builds dir(here):
    cp ${SRCDIR}/jars/insane/lists/META-INF/COPYRIGHT ./COPYRIGHT
    cp ${SRCDIR}/jars/insane/lists/META-INF/LICENSE   ./LICENSE
    cp ${SRCDIR}/jars/insane/lists/META-INF/NOTICE    ./NOTICE 
    chmod a+r COPYRIGHT LICENSE NOTICE 
    cp ${PUBLISHBUILDINFO} ./buildInfo${REVISION}
    chmod a+r buildInfo${REVISION}
    # Ditto to ISP:
    ## ${SCPUT} COPYRIGHT ${PUBLISHUSER}@${PUBLISHSITE}:${PUBLISHDIR}/builds/COPYRIGHT
    ## ${SCPUT} LICENSE   ${PUBLISHUSER}@${PUBLISHSITE}:${PUBLISHDIR}/builds/LICENSE
    ## ${SCPUT} NOTICE    ${PUBLISHUSER}@${PUBLISHSITE}:${PUBLISHDIR}/builds/NOTICE
    ## ${SCPUT} buildInfo${REVISION} ${PUBLISHUSER}@${PUBLISHSITE}:${PUBLISHDIR}/builds/buildInfo${REVISION}

    echo "<TR>" > this.txt
    # Build date & time
    echo "<TD>${STARTTIME}</TD>" >> this.txt
    # SVN revision
    echo "<TD>${REVISION}</TD>" >> this.txt
    # Build info.
    BUILDREF="<TD><a href=\"buildInfo${REVISION}\">Build OK</a></TD>"
    if [ -e ${DERBYDIR}/testing/UpdateInfo/${REVISION}-buildDetails.txt ]
    then
      BUILDREF="<TD><A HREF=\"../UpdateInfo/${REVISION}-buildDetails.txt\"><font color=\"red\"><b>Build errors</b></font></A></TD>" 
    fi
    echo ${BUILDREF} >> this.txt
    # Test results
    RESULTREF="<TD><A HREF=\"../Present/testSummary-${REVISION}.html\">Test results</A></TD>"
                              # Present is a link to Limited(public) or Full(local)
    echo ${RESULTREF} >> this.txt
    # zip
    echo "<TD><A HREF=\"${ZIPPEDJARS}\">${ZIPPEDJARS}</A></TD>" >> this.txt
    # tar.gz
    echo "<TD>tar.gz</TD>" >> this.txt
    echo "</TR>" >> this.txt
    # NB. 8-eight lines are added per build.
    # Never present more than last 11 builds so use following 'head -((11-1)*8)' = 'head -80'
    # NB. Manually clean old zipped jar files locally AND remote.
    # cp buildlist.txt old_buildlist.txt
    head -80 buildlist.txt > old_buildlist.txt
    cat this.txt old_buildlist.txt > buildlist.txt
    cat top.txt buildlist.txt bottom.txt > index.html
    cat top_ext.txt buildlist.txt bottom_ext.txt > index_ext.html
    chmod a+r index.html index_ext.html
    # Transfer the index_ext.html file to ISP:
    SRC="index_ext.html"
    DST="${PUBLISHDIR}/builds/index.html"
    # echo "**** OBS! ${SCPUT} ${SRC} ${PUBLISHUSER}@${PUBLISHSITE}:${DST}"
    # ${SCPUT} ${SRC} ${PUBLISHUSER}@${PUBLISHSITE}:${DST}
  fi #  if [ "${MKBUILDZIP}" == "BuildZippedJars" ]
    exit
  fi # if [ "`grep "BUILD FAILED" ${BUILDLOGDIR}/${BUILDID}/buildDetails | wc -l | gawk '{ print $1 }'`" = "0" ]

    ########################################
    # Buid was not successful, tell it...
    # PARTLY DUPLICATED FROM ABOVE...
    ## SHOWBUILDERRORS=""
    ## if [ "`grep "errors" ${BUILDLOGDIR}/${BUILDID}/buildDetails | grep "\[javac\]" | wc -l | gawk '{ print $1 }'`" != "0" ]
    ## then
        SUBJECT="WARNING! There were build ERRORs! - ${REVISION} ${SANDBOX}"
        ## SHOWBUILDERRORS="${BUILDLOGDIR}/${BUILDID}/buildDetails"
        echo "touch ${BUILDLOGDIR}/buildERRORS"
        touch ${BUILDLOGDIR}/buildERRORS

        cp ${BUILDLOGDIR}/${BUILDID}/buildDetails ${DERBYDIR}/testing/UpdateInfo/${REVISION}-buildDetails

        SEDSCR="'s:${DERBYDIR}/::'"
        SEDCMD="sed -e ${SEDSCR} ${DERBYDIR}/testing/UpdateInfo/${REVISION}-buildDetails "
        echo ${SEDCMD} > sedCmd$$
        . ./sedCmd$$ \
                   > ${DERBYDIR}/testing/UpdateInfo/${REVISION}-buildDetails.txt
        rm sedCmd$$

        rm ${DERBYDIR}/testing/UpdateInfo/${REVISION}-buildDetails
        chmod go+r ${DERBYDIR}/testing/UpdateInfo/${REVISION}-buildDetails.txt
    ## fi
    ########################################

fi

### UNCOMMENT TO SEND MAIL. ${TOOLDIR}/textMail "${SANDBOX} build failed" "${MAILTOINT}" "${BUILDLOGDIR}/lastBuildInfo ${BUILDLOGDIR}/${BUILDID}/buildDetails"
### UNCOMMENT TO SEND MAIL. # ${TOOLDIR}/textMail "${SANDBOX} build failed" "${MAILTOEXT}" "${BUILDLOGDIR}/lastBuildInfo ${BUILDLOGDIR}/${BUILDID}/buildDetails"
