# !/bin/sh

#------------------------------------------------------------------------------------------------------
#    This script is designed to copy test result files from a "root" location
#       to the coresponding hosted location on the Eclipse Download site.
#
#    Assumptions:
#       - results will be stored locally in the following hierarchy:
#             ${RESULTROOT}/${VERSION}/${QUALIFIER}/${HOSTNAME} (example: ${ROOT}/2.2.0/v20101116-r8433/Eclipse)
#       - there is a "TestConfiguration.html" in each host dir (specific to each run)
#       - the current user id matches the commiter uid at Eclipse or an alternate is specified
#       - the machine running this script has setup SSH authentication for that user to dev.eclipse.org
#
#    Author: Eric Gwin (Oracle)
#
#------------------------------------------------------------------------------------------------------
#    Detailed information on setting up ssh using keygen can be found at many sites on the net, I
#    looked at:
#       http://sial.org/howto/openssh/publickey-auth/
#
#    Using ssh through a firewall will require the use of a proxy. Proxy settings differ with the shell 
#    and linux distribution you are using, but generally either require the http_proxy or HTTP_PROXY
#    env variables be setup:
#        export http_proxy=<proxy server>:<proxy port> 
#        export HTTP_PROXY=<proxy server>:<proxy port>
#
#------------------------------------------------------------------------------------------------------


#==========================
#   Basic Env Setup
#

#Define common variables
CUR_DIR=`dirname .`
START_DATE=`date '+%y%m%d-%H%M'`
SSH_USER=
SCP_OPTIONS="-Bpqr"

#Directories
PUBLISH_HOME=/home/data/httpd/download.eclipse.org/rt/eclipselink/nightly
PUBLISH_SERVER=build.eclipse.org

#==========================
#   Functions Definitions
#
unset Usage
Usage() {
    echo "ERROR: Invalid usage detected!"
    echo "USAGE: ./`basename ${0}` RESULTROOT RESULTBUILD HOSTNAME COMMIT_ID [\> LOGFILE 2\>\&1]"
    echo "Where:       RESULTROOT = Path to local results hierarchy"
    echo "             RESULTBUILD= OSGi-like version of build tested (2.2.0.v20101116-r8433)"
    echo "             HOSTNAME   = host conguration name"
    echo "             COMMIT_ID  = optional uid of comitter publishing (assumes local user)"
    echo ""
    echo "    Assumptions:"
    echo "       - results will be stored locally in the following hierarchy:"
    echo "             ${RESULTROOT}/${VERSION}/${QUALIFIER}/${HOSTNAME} (example: ${ROOT}/2.2.0/v20101116-r8433/Oracle1)"
    echo "       - there is a "TestConfiguration.html" in the host dir (specific to each run)"
    echo "       - there is a "ResultSummary.dat" in the host dir (specific to each run)"
    echo "       - the current user id matches the commiter uid at Eclipse or an alternate is specified"
    echo "       - the machine running this script has setup SSH authentication for that user to dev.eclipse.org"
    echo ""
    echo "    Specifications:"
    echo "        TestConfiguration.html:"
    echo "            This file should be generated by the testing process in question. It should be a valid html"
    echo "            document and should specify, the hardware, OS, JDK version and manufacturer, Database brand"
    echo "            and version, the driver name and version as well as any other tools and their versions pertinent"
    echo "            to replicating the test environment. This file is direcly link to in the generated build pages."
    echo "        ResultSummary.dat:"
    echo "            This file should be generated by the testing process in question, though it may be generated by the"
    echo "            Ant process. It lists the result files for the host, the number of tests in suite (the historic"
    echo "            benchmark from previous runs used to generate status of run - less/expected/more), the number"
    echo "            that did run, and the number of reported errors+failures (non-zero used to flag problems) in the"
    echo "            following format:"
    echo "                <testresult_file>:<NumberInSuite>:<TestsRun>:<errors+failures>"
    echo "            the nightly generation script looks for the following files in order (others will be ignored):"
    echo "                eclipselink-core-lrg-<release version>.html"
    echo "                eclipselink-jpa-lrg-<release version>.html"
    echo "                eclipselink-jpa-wdf-lrg-<release version>.html"
    echo "                eclipselink-jaxb-lrg-<release version>.html"
    echo "                eclipselink-oxm-lrg-<release version>.html"
    echo "                eclipselink-sdo-lrg-<release version>.html"
    echo "                eclipselink-dbws-lrg-<release version>.html"
    echo "                eclipselink-dbws-util-lrg-<release version>.html"
    echo ""
    exit
}

unset parseResultBuild
parseResultBuild() {
    build_version=$1
    build_version_string="Error: Invalid build_version: '${build_version}'!"

    ## Parse for VERSION, and QUALIFIER
    VERSION=`echo ${build_version} | cut -d'.' -f1-3`
    QUALIFIER=`echo ${build_version} | cut -d'.' -f4`
    BLDDATE=`echo ${QUALIFIER} | cut -s -d'-' -f1 | cut -d'v' -f2`

    #echo "VERSION='${VERSION}' QUALIFIER='${QUALIFIER}' BLDDATE='${BLDDATE}'"
}

unset validateParameters
validateParameters() {
    error=false
    if [ ! -d ${RESULTROOT} ] ; then
        echo "Error: Publish location not found!"
        echo "       RESULTROOT: '${RESULTROOT}' doesn't exist!"
        exit
    fi
    if [ ! -d ${RESULTROOT}/${VERSION} ] ; then
        echo "Error: Publish location not found!"
        echo "       VERSION: '${RESULTROOT}/${VERSION}' doesn't exist!"
        exit
    fi
    if [ ! -d ${RESULTROOT}/${VERSION}/${QUALIFIER} ] ; then
        echo "Error: Publish location not found!"
        echo "       QUALIFIER: '${RESULTROOT}/${VERSION}/${QUALIFIER}' doesn't exist!"
        exit
    fi
    SOURCEPATH=${RESULTROOT}/${VERSION}/${QUALIFIER}/${HOSTNAME}
    if [ ! -d ${SOURCEPATH} ] ; then
        echo "Error: Publish location not found!"
        echo "       HOSTNAME: '${SOURCEPATH}' doesn't exist!"
        exit
    fi
    if [ ! -f ${SOURCEPATH}/TestConfiguration.html ] ; then
        echo "Error: Test Configuration description not found!"
        echo "       '${SOURCEPATH}/TestConfiguration.html' doesn't exist!"
        error=true
    fi
    if [ ! -f ${SOURCEPATH}/ResultSummary.dat ] ; then
        echo "Error: ResultSummary datafile not found!"
        echo "       '${SOURCEPATH}/ResultSummary.dat' doesn't exist!"
        error=true
    fi
    if [ "$error" = "true" ] ; then
        exit
    fi
}

unset publishResults
publishResults() {
        DESTPATH=${SSH_USER}${PUBLISH_SERVER}:${PUBLISH_HOME}/${VERSION}/${BLDDATE}/.

        echo ""
        echo "Using secure copy to publish files:"
        echo "   From: ${SOURCEPATH}"
        echo "   To:   ${DESTPATH}"
        scp ${SCP_OPTIONS} ${SOURCEPATH} ${DESTPATH}
}

unset postProcess
postProcess() {
    echo "PostProcessing..."
    echo "   Generating notification for ${PROC} publishing for ${BRANCH} build ${QUALIFIER}..."
    echo "   Not sent..."
    # cleanup
    echo "Done."
}

#==========================
#   Main Begins
#
#==========================
if [ "$#" -lt 3 ] ; then
    echo "Error: Incorrect number of arguments!"
    Usage
fi

RESULTROOT=$1
RESULTBUILD=$2
HOSTNAME=$3
COMMIT_ID=$4

if [ ! "$COMMIT_ID" = "" ] ; then
    SSH_USER=${COMMIT_ID}@
fi

parseResultBuild ${RESULTBUILD}
validateParameters
publishResults
