# !/bin/sh
#****************************************************************************************
# Copyright (c) 2012, 2013 Oracle and/or its affiliates. All rights reserved.
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
# which accompanies this distribution.
#
# The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
# and the Eclipse Distribution License is available at
# http://www.eclipse.org/org/documents/edl-v10.php.
#
# Contributors:
#  - egwin - 13 September 2012 - Initial implementation
#  - egwin - 07 March 2013     - Updates for staging to SonatypeOSS
#****************************************************************************************

#----------------------------------------------------------------------------------------
#    This script is designed to be run interactively to promote an existing published
#    build to a milestone, or a Milestone build to a release. It expects to be run from
#    the 'build.eclipse.com' server.
#----------------------------------------------------------------------------------------

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

#Define common variables
THIS=$0
PROGNAME=`basename ${THIS}`
CUR_DIR=`dirname ${THIS}`
umask 0002
BUILD=$1
MILESTONE=$2
BRANCH_NM=$3
DEBUG_ARG=$4

ANT_ARGS=" "
ANT_OPTS="-Xms512m -Xmx1024m -XX:MaxPermSize=512m"
START_DATE=`date '+%y%m%d-%H%M'`

#Directories
ANT_HOME=/shared/common/apache-ant-1.7.0
HOME_DIR=/shared/rt/eclipselink
EXEC_DIR=${HOME_DIR}
DNLD_DIR=/home/data/httpd/download.eclipse.org/rt/eclipselink
JAVA_HOME=/shared/common/jdk-1.6.x86_64
LOG_DIR=${HOME_DIR}/logs
RELENG_REPO=${HOME_DIR}/eclipselink.releng
RUNTIME_REPO=${HOME_DIR}/eclipselink.runtime

#ANT Invokation Variables
BUILDFILE=${RUNTIME_REPO}/autobuild.xml
ANT_TARGET=build-milestone

#Global Variables
RELEASE=false

PATH=${JAVA_HOME}/bin:${ANT_HOME}/bin:/usr/bin:/usr/local/bin:${PATH}

# Export necessary global environment variables
export ANT_ARGS ANT_OPTS ANT_HOME HOME_DIR JAVA_HOME LOG_DIR PATH
#==========================
#   Functions Definitions
#
unset usage
usage() {
    echo "Usage: ${PROGNAME} (BUILD |'release') MILESTONE BRANCH_NM [debug]"
    echo "   BUILD     - full build identifier, or 'release' (example: 2.4.1.v201209013-98ef31a). Used to generate branch,"
    echo "               version, date and hash info needed. If 'release', tells promote to release the specified"
    echo "               MILESTONE."
    echo "   MILESTONE - a milestone (exampe: M4) to promote the specified build to. Also used in dir storage, and maven."
    echo "               storage, and Maven publishing."
    echo "   BRANCH_NM - The git branchname for the branch the build was based upon (Example: master, 2.4, 2.3, etc.)"
    echo "   DEBUG_ARG - if defined, designates a run should be 'debug'."
}

unset createPath
createPath() {
    # Usage: createPath path
    path=$1

    if [ "${DEBUG}" = "true" ] ; then
        echo "createPath: Attempting to create '${path}' path."
    fi
    newdir=
    for directory in `echo ${path} | tr '/' ' '`
    do
        newdir=${newdir}/${directory}
        if [ ! -d "${newdir}" ] ; then
            if [ "${DEBUG}" = "true" ] ; then
                echo "createPath: Creating subdir: '${newdir}'"
            fi
            mkdir ${newdir}
            if [ $? -ne 0 ]
            then
                echo "   Error (createPath):  Creation of ${newdir} failed!"
                exit
            fi
        fi
    done
}

unset genSafeTmpDir
genSafeTmpDir() {
    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}'"
}

unset parseBuild
parseBuild() {
    build=$1

    echo "- parseBuild -"

    # cut parameters: -s: only print if delimeter exists in input; -d delimeter; -f field(s) to print
    BRANCH=`echo ${build} | cut -s -d'.' -f1-2`
    if [ "${BRANCH}" = "" ] ; then
        usage
        echo "BRANCH Error: There is something wrong with BUILD. ('$build' should be VERSION.QUALIFIER)!"
        echo "              VERSION should be in the 3 part OSGi standard - Major.Minor.patch"
        echo " "
        exit 2
    fi

    VERSION=`echo ${build} | cut -s -d'.' -f1-3`
    if [ "${VERSION}" = "" ] ; then
        usage
        echo "VERSION Error: There is something wrong with BUILD. ('$build' should be VERSION.QUALIFIER)!"
        echo "               VERSION should be in the 3 part OSGi standard - Major.Minor.patch"
        echo " "
        exit 2
    fi

    QUALIFIER=`echo ${build} | cut -s -d'.' -f4`
    if [ "${QUALIFIER}" = "" ] ; then
        usage
        echo "QUALIFIER Error: There is something wrong with BUILD. ('$build' should be VERSION.QUALIFIER)!"
        echo "                 QUALIFIER should be in the form: vDATE-HASH where DATE is YYYYMMDD"
        echo " "
        exit 2
    fi

    # assign value of first field delimited by '-' (only use values containing '-' (-s)), with 'v' stripped, to DATE
    BLD_DATE=`echo ${QUALIFIER} | cut -s -d'-' -f1 | cut -s -d'v' -f2`
    if [ "${BLD_DATE}" = "" ] ; then
        usage
        echo "BLD_DATE Error: There is something wrong with QUALIFIER!"
        echo "                '$qualifier' should be in the form:"
        echo "                     vDATE-HASH where DATE is YYYYMMDD"
        echo " "
        exit 2
    fi

    # assign value of 2nd field delimited by '-' (only use values containing '-' (-s)), to HASH
    GIT_HASH=`echo ${QUALIFIER} | cut -s -d'-' -f2`
    if [ "${GIT_HASH}" = "" ] ; then
        usage
        echo "GIT_HASH Error: There is something wrong with QUALIFIER!"
        echo "                '$qualifier' should be in the form:"
        echo "                     vDATE-HASH where DATE is YYYYMMDD"
        echo " "
        exit 2
    fi

    if [ "$DEBUG" = "true" ] ; then
        echo "build    ='$build'"
        echo "BRANCH   ='$BRANCH'"
        echo "VERSION  ='$VERSION'"
        echo "QUALIFIER='$QUALIFIER'"
        echo "BLD_DATE ='$BLD_DATE'"
        echo "GIT_HASH ='$GIT_HASH'"
    fi
}

unset validateGitRepo
validateGitRepo() {

    echo "- validateGitRepo -"

    #Must run git commands from Git repo dir so, store current dir, and switch to repo
    curdir=`pwd`
    cd ${RUNTIME_REPO}

    # parse status of repo for current branch
    ststus_msg=`${GIT_EXEC} status`
    gitbranch=`echo $ststus_msg | grep -m1 "#" | cut -s -d' ' -f4`
    echo "Currently on '${gitbranch}' in '${RUNTIME_REPO}'"

    # is current branch the desired branch?
    error_cnt=0
    if [ "${BRANCH_NM}" = "${gitbranch}" ] ; then
       echo "Git repo already on branch '$BRANCH_NM'."
    else
       # switch to desired branch
       ${GIT_EXEC} checkout ${BRANCH_NM}
       if [ "$?" = "0" ] ; then
           # parse status of repo for current branch
           ststus_msg=`${GIT_EXEC} status`
           gitbranch=`echo $ststus_msg | grep -m1 "#" | cut -s -d' ' -f4`
           echo "Now on '${gitbranch}' in '${RUNTIME_REPO}'"
           echo "Git checkout complete."
       else
           # if encountered error, increment error_cnt
           error_cnt=`expr ${error_cnt} + 1`
       fi
    fi

    # verify switch took place
    if [ "$error_cnt" = "0" ] ; then
        echo "Git Repo on correct branch for promotion to continue..."
    else
        echo "Error detected switching branches. exiting..."
        exit 1
    fi

    # ensure repo is up-to-date
    # has to occur after setting the correct banch because "git pull" only grabs changes on the active branch.
    echo "Ensuring repo is up-to-date."
    ${GIT_EXEC} pull

    cd $curdir
}

unset validateBuild
validateBuild() {
    echo "- validateBuild -"

    if [ -d ${DNLD_DIR}/nightly/${VERSION}/${BLD_DATE} ] ; then
        echo "Valid build dir: '${DNLD_DIR}/nightly/${VERSION}/${BLD_DATE}'"
        if [ -e ${DNLD_DIR}/nightly/${VERSION}/${BLD_DATE}/eclipselink-${VERSION}.${QUALIFIER}.zip ] ; then
            echo "Valid build: '${DNLD_DIR}/nightly/${VERSION}/${BLD_DATE}/eclipselink-${VERSION}.${QUALIFIER}.zip' found."
        else
            echo "Invalid build: '${DNLD_DIR}/nightly/${VERSION}/${BLD_DATE}/eclipselink-${VERSION}.${QUALIFIER}.zip' not found."
            echo "Valid builds are:"
            ls ${DNLD_DIR}/nightly/${VERSION}/${BLD_DATE}/eclipselink-${VERSION}*.zip
            exit 1
        fi
    else
            echo "Invalid build dir: '${DNLD_DIR}/nightly/${VERSION}/${BLD_DATE}'"
            echo "Valid build dates are:"
            ls ${DNLD_DIR}/nightly/${VERSION}
            exit 1
   fi
   #cd $curdir

}

# TODO: again NEED branch to verify instead of branch_NM, but need branch_NM to interact with Git
unset validateMilestone
validateMilestone() {
    milestone=$1
    echo "- validateMilestone -"

    # TODO: Verify ${milestone} is 'release', or starts with M# or RC#
    if [ -d ${DNLD_DIR}/milestones/${VERSION}/${milestone} ] ; then
        echo "Milestone dir: '${DNLD_DIR}/milestones/${VERSION}/${milestone}' already exists."
        if [ -e ${DNLD_DIR}/milestones/${VERSION}/${milestone}/eclipselink-${VERSION}.${QUALIFIER}.zip ] ; then
            echo "     Milestone ${milestone} Build: '${DNLD_DIR}/milestones/${VERSION}/${milestone}/eclipselink-${VERSION}.${QUALIFIER}.zip' already promoted."
        else
            promotedBuild=`ls ${DNLD_DIR}/milestones/${VERSION}/${milestone}/eclipselink-${VERSION}*.zip`
            echo "     Milestone ${milestone} Build: '${promotedBuild}' found."
        fi
        echo "     You should either choose another Milestone number, or clean previous promote (if partial) before running again."
        exit 1
    else
        echo "Milestone dir: '${DNLD_DIR}/milestone/${VERSION}/${milestone}' not preexisting."
        echo "Continuing..."
    fi
}

unset parseVersion
parseVersion() {
    branch_nm=$1
    echo "- parseVersion -"

    if [ -d ${DNLD_DIR}/milestones ] ; then
        if [ "$branch_nm" = "master" ] ; then
            # Version is 'highest' dir ending in '0'
            VERSION=`ls -r ${DNLD_DIR}/milestones | grep -m1 0$`
        else
            # Version is 'highest' dir begining with value of $branch_nm
            VERSION=`ls -r ${DNLD_DIR}/milestones | grep -m1 $branch_nm`
        fi
    else
        echo "Cannot find milestones. '${DNLD_DIR}/milestones' not found."
    fi
    echo "Version= '$VERSION'"
}

unset validateReleaseMilestone
validateReleaseMilestone() {
    milestone=$1
    echo "- validateReleaseMilestone -"

    # if milestone begins with either "M" or "RC" (doesn't (not begin with M) and (not begin with RC))
    test1=`echo $milestone | grep -m1 ^M`
    test2=`echo $milestone | grep -m1 ^RC`
    if [ ! \( \( "$test1" = "" \) -a \( "$test2" = "" \) \) ] ; then
        if [ -d ${DNLD_DIR}/milestones/${VERSION}/${milestone} ] ; then
            echo " Target Milestone dir: '${DNLD_DIR}/milestones/${VERSION}/${milestone}' exists. Continuing..."
        else
            echo "Milestone dir: '${DNLD_DIR}/milestones/${VERSION}/${milestone}' doesn't exist."
            exit 1
        fi
    else
        usage
        echo "Invalid Milestone detected: '$milestone' doesn't begin with 'M' or 'RC'"
        exit 1
    fi
}

unset parseReleaseMilestone
parseReleaseMilestone() {
    #find 'build' data from published milestone
    echo "Target Milestone: '${MILESTONE}'"

    BUILD=`ls ${DNLD_DIR}/milestones/${VERSION}/${MILESTONE} | grep -m1 P2signed | cut -d'-' -f3-4 | cut -d'.' -f1-4`
    echo "BUILD: '${BUILD}'"

    # set Milestone to 'release' for ant script
    # TODO: fix ant so will promote from published milestone rather than nightly
    MILESTONE=RELEASE
    parseBuild ${BUILD}
}

#TODO Must have Git validation and setup completed first
unset callAnt
callAnt() {
    #Need milestine branch, version, qualifier, date, githash
    milestone=$1
    branch=$2
    branch_nm=$3
    version=$4
    qualifier=$5
    blddate=$6
    githash=$7

    echo " "
    echo "- callAnt -"

    # Define SYSTEM variables needed
    BldDepsDir=${HOME_DIR}/bld_deps/${branch}    # Needed for Eclipse dependencies when publishing/promoting
    if [ ! -d "${BldDepsDir}" ] ; then
        echo "${BldDepsDir} not found!"
    fi
    if [ ! -d "${RELENG_REPO}" ] ; then
        echo "${RELENG_REPO} not found!"
    fi

    #verify src, root dest, and needed variables exist before proceeding
    if [ \( ! "${milestone}" = "" \) -a \( ! "${branch}" = "" \) -a \( ! "${blddate}" = "" \) -a \( ! "${version}" = "" \) -a \( ! "${qualifier}" = "" \) ] ; then
        echo "Preparing to promote ${milestone} for ${version}...."
        if [ "${DEBUG}" = "true" ] ; then
            echo "callAnt: Required data verified... proceeding..."
            echo "   milestone = '${milestone}'"
            echo "   branch    = '${branch}'"
            echo "   blddate   = '${blddate}'"
            echo "   version   = '${version}'"
            echo "   qualifier = '${qualifier}'"
            echo "   githash   = '${githash}'"
        fi

        #Invoke Antscript for Branch specific promotion
        arguments="-Dbuild.deps.dir=${BldDepsDir} -Dreleng.repo.dir=${RELENG_REPO} -Dgit.exec=${GIT_EXEC}"
        arguments="${arguments} -Dbranch.name=${branch_nm} -Drelease.version=${version} -Dbuild.type=${milestone} -Dbranch=${branch}"
        arguments="${arguments} -Dversion.qualifier=${qualifier} -Dbuild.date=${blddate} -Dgit.hash=${githash}"
#        arguments="${arguments} -Drepository.username=${USER} -Drepository.userpass=${PASSWD}"

        # Run Ant from ${exec_location} using ${buildfile} ${arguments}
        echo "pwd='`pwd`"
        echo "ant ${BUILDFILE} ${arguments} ${ANT_TARGET}"
        if [ -f ${BUILDFILE} ] ; then
            ant -f ${BUILDFILE} ${arguments} ${ANT_TARGET}
            if [ "$?" = "0" ]
            then
                echo "Ant promote complete."
            else
                echo "Ant Promote Failed!"
            fi
        else
            echo "'${BUILDFILE}' doesn't exist. Aborting ant run..."
        fi
    else
        # Something is not right! skipping.."
        echo "    Required locations and data failed to verify... aborting Promote...."
        ERROR=true
        if [ "${DEBUG}" = "true" ] ; then
            echo "callAnt: Required locations and data:"
            echo "   milestone = '${milestone}'"
            echo "   branch    = '${branch}'"
            echo "   blddate   = '${blddate}'"
            echo "   version   = '${version}'"
            echo "   qualifier = '${qualifier}'"
            echo "   githash   = '${githash}'"
        fi
    fi
}



#==========================
#   Main Begins

#==========================
#   Validate run parameters
if [ "${BUILD}" = "" ] ; then
    usage
    echo " "
    echo "BUILD not specified! Exiting..."
    exit 1
fi
if [ "${MILESTONE}" = "" ] ; then
    usage
    echo " "
    echo "MILESTONE not specified! Exiting..."
    exit 1
fi
if [ "${BRANCH_NM}" = "" ] ; then
    usage
    echo " "
    echo "BRANCH_NM not specified! Exiting..."
    exit 1
fi
#if [ "${USER}" = "" ] ; then
#    echo " "
#    echo "USER not specified! Exiting..."
#    exit 1
#fi
#if [ "${PASSWD}" = "" ] ; then
#    usage
#    echo " "
#    echo "PASSWD not specified! Exiting..."
#    exit 1
#fi
#  If anything is in DEBUG_ARG then do a dummy "DEBUG" run
#  (Do not call ant, do not modify or create files, do report variable states)
DEBUG=false
if [ -n "$DEBUG_ARG" ] ; then
    DEBUG=true
    echo "Debug is on!"
fi

#==========================
#     Define Environment
echo "-= Validate Environment =- "
if [ ! -d ${JAVA_HOME} ] ; then
    echo "Expecting Java at: '${JAVA_HOME}', but is not there!"
    JAVA_HOME=/shared/common/jdk1.6.0_05
    if [ ! -d ${JAVA_HOME} ] ; then
        echo "Tried again. Expecting Java at: '${JAVA_HOME}', but is not there!"
        #exit
    fi
fi
echo "JAVA_HOME verified at: '${JAVA_HOME}'"

if [ ! -d ${ANT_HOME} ] ; then
    echo "Expecting Ant at: '${ANT_HOME}', but is not there!"
    #exit
fi
echo "ANT_HOME verified at: '${ANT_HOME}'"

if [ ! -d ${HOME_DIR} ] ; then
    echo "Need to create HOME_DIR '${HOME_DIR}'"
    if [ "${DEBUG}" = "false" ] ; then
        echo "DEBUG=$DEBUG"
        createPath ${HOME_DIR}
    else
        echo "    Debug on, No actual work being done."
    fi
fi
if [ ! -d ${LOG_DIR} ] ; then
    echo "Need to create LOG_DIR '${LOG_DIR}'"
    if [ "${DEBUG}" = "false" ] ; then
        createPath ${LOG_DIR}
    else
        echo "    Debug on, No actual work being done."
    fi
fi
GIT_EXEC=/usr/local/bin/git
if [ ! -x ${GIT_EXEC} ] ; then
    echo "Cannot find Git executable using default value '$GIT_EXEC'. Attempting Autofind..."
    GIT_EXEC=`which git`
    if [ $? -ne 0 ] ; then
        echo "Error: Unable to find GIT executable! Git functionality disabled."
        GIT_EXEC=false
        exit 1
    else
        echo "Found: ${GIT_EXEC}"
    fi
else
    echo "Found: ${GIT_EXEC}"
fi
if [ ! -d ${RELENG_REPO} ] ; then
    echo "Releng repo missing! Will try to clone."
    echo "${GIT_EXEC} clone ssh://git.eclipse.org/gitroot/eclipselink/eclipselink.releng.git"
    if [ ! -d ${RELENG_REPO} ] ; then
        echo "Still cannot find '${RELENG_REPO}'. Something went wrong... aborting."
        exit 1
    else
        echo "Cloning successful."
    fi
else
    echo "Releng repo '${RELENG_REPO}' found."
fi
if [ ! -d ${RUNTIME_REPO} ] ; then
    echo "EclipseLink Runtime repo missing! Will try to clone."
    echo "${GIT_EXEC} clone ssh://git.eclipse.org/gitroot/eclipselink/eclipselink.runtime.git"
    if [ ! -d ${RUNTIME_REPO} ] ; then
        echo "Still cannot find '${RUNTIME_REPO}'. Something went wrong... aborting."
        exit 1
    else
        echo "Cloning successful."
    fi
else
    echo "EclipseLink Runtime repo '${RUNTIME_REPO}' found."
fi
echo "   Validated."
echo " "

## 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

#==========================
#   Begin WORK
echo "Promote begin at: ${START_DATE}"

#Determine if 'release' run or regular Milestone promotion
if [ "$BUILD" = "release" ] ; then
    RELEASE=true
    # Figure out VERSION based upon BRANCH_NM
    parseVersion $BRANCH_NM

    # verify that specified milestone exists.
    validateReleaseMilestone $MILESTONE

    # relevant build coordinats from Milestone artifacts
    parseReleaseMilestone

    # Ensure we are on the correct branch in the repo, if build info is good
    validateGitRepo
else
    # Get needed info from BUILD
    parseBuild $BUILD

    # Validate BUILD Exists
    validateBuild

    # Ensure we are on the correct branch in the repo, if build info is good
    validateGitRepo

    # Validate MILESTONE against convention, and verify not preexisting
    validateMilestone $MILESTONE
fi

echo "BUILD      ='${BUILD}'"
echo "  BRANCH   ='$BRANCH'"
echo "  VERSION  ='$VERSION'"
echo "QUALIFIER  ='$QUALIFIER'"
echo "  BLD_DATE ='$BLD_DATE'"
echo "  GIT_HASH ='$GIT_HASH'"
echo "MILESTONE  ='${MILESTONE}'"
echo "BRANCH_NM  ='${BRANCH_NM}'"

callAnt $MILESTONE $BRANCH $BRANCH_NM $VERSION $QUALIFIER $BLD_DATE $GIT_HASH

echo "Promote complete at: `date '+%y%m%d-%H%M'`"
echo " "
echo " "
