#!/bin/bash
#
#   Licensed 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.

if [ "${TESTPATCHDEBUG}" == "true" ] ; then
    set -x
fi

BASEDIR=$(pwd)
TEMPDIR=${BASEDIR}/tmp

JIRAAVAILPATCHQUERY="https://issues.apache.org/jira/sr/jira.issueviews:searchrequest-xml/temp/SearchRequest.xml?jqlQuery=project+in+%28BOOKKEEPER%29+AND+status+%3D+%22Patch+Available%22+ORDER+BY+updated+DESC&tempMax=1000"
TESTPATCHJOBURL="https://builds.apache.org/job/bookkeeper-trunk-precommit-build"
TOKEN=""
SUBMIT="false"
DELETEHISTORYFILE="false"

RUNTESTSFILE=${BASEDIR}/TESTED_PATCHES.txt

printUsage() {
    echo "Usage: $0 <OPTIONS>"
    echo "          --submit --token=<BOOKKEEPER PRECOMMIT JOB TOKEN>"
    echo "          [--delete-history-file]"
    echo "          [--script-debug]"
    echo
}
###############################################################################
parseArgs() {
    for i in $*
    do
        case $i in
        --submit)
            SUBMIT="true"
            ;;
        --token=*)
            TOKEN=${i#*=}
            ;;
        --script-debug)
            DEBUG="-x"
            ;;
        --delete-history-file)
            DELETEHISTORYFILE="true"
            ;;
        *)
            echo "Invalid option"
            echo
            printUsage
            exit 1
            ;;
        esac
    done
    if [[ "$SUBMIT" == "true" && "${TOKEN}" == "" ]] ; then
        echo "Token has not been specified"
        echo
        printUsage
        exit 1
    fi
}

###############################################################################
findAndSubmitAvailablePatches() {
    ## Grab all the key (issue numbers) and largest attachment id for each item in the XML
    curl --fail --location --retry 3 "${JIRAAVAILPATCHQUERY}" > ${TEMPDIR}/patch-availables.xml
    if [ "$?" != "0" ] ; then
        echo "Could not retrieve available patches from JIRA"
        exit 1
    fi
    xpath -e "//item/key/text() | //item/attachments/attachment[not(../attachment/@id > @id)]/@id" \
        ${TEMPDIR}/patch-availables.xml > ${TEMPDIR}/patch-attachments.element

    ### Replace newlines with nothing, then replace id=" with =, then replace " with newline
    ### to yield lines with pairs (issueNumber,largestAttachmentId). Example: BOOKKEEPER-123,456984
    cat ${TEMPDIR}/patch-attachments.element \
        | awk '{ if ( $1 ~ /^BOOKKEEPER\-/) {JIRA=$1 }; if ($1 ~ /id=/) { print JIRA","$1} }' \
        | sed 's/id\="//' | sed 's/"//' > ${TEMPDIR}/patch-availables.pair

    ### Iterate through issue list and find the (issueNumber,largestAttachmentId) pairs that have
    ### not been tested (ie don't already exist in the patch_tested.txt file
    touch ${RUNTESTSFILE}
    cat ${TEMPDIR}/patch-availables.pair | while read PAIR ; do
        set +e
        COUNT=`grep -c "$PAIR" ${RUNTESTSFILE}`
        set -e
        if [ "$COUNT" -lt "1" ] ; then
        ### Parse $PAIR into project, issue number, and attachment id
            ISSUE=`echo $PAIR | sed -e "s/,.*$//"`
            echo "Found new patch for issue $ISSUE"
            if [ "$SUBMIT" == "true" ]; then
            ### Kick off job
                echo "Submitting job for issue $ISSUE"
                curl --fail --location --retry 3 \
                    "${TESTPATCHJOBURL}/buildWithParameters?token=${TOKEN}&JIRA_NUMBER=${ISSUE}" > /dev/null
                if [ "$?" != "0" ] ; then
                    echo "Could not submit precommit job for $ISSUE"
                    exit 1
                fi
            fi
            ### Mark this pair as tested by appending to file
            echo "$PAIR" >> ${RUNTESTSFILE}
        fi
    done
}
###############################################################################

mkdir -p ${TEMPDIR} 2>&1 $STDOUT

parseArgs "$@"

if [ -n "${DEBUG}" ] ; then
    set -x
fi

if [ "${DELETEHISTORYFILE}" == "true" ] ; then
    rm ${RUNTESTSFILE}
fi

findAndSubmitAvailablePatches

exit 0
