#!/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+%28OOZIE%29+AND+status+%3D+%22Patch+Available%22+ORDER+BY+updated+DESC&tempMax=1000"
TESTPATCHJOBURL="https://builds.apache.org/job/oozie-trunk-precommit-build"
TOKEN=""
SUBMIT="false"
DELETEHISTORYFILE="false"

RUNTESTSFILE=${BASEDIR}/TESTED_PATCHES.txt

printUsage() {
  echo "Usage: $0 <OPTIONS>"
  echo "          --submit --token=<OOZIE 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 -q -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: OOZIE-123,456984
cat ${TEMPDIR}/patch-attachments.element | awk '{ if ( $1 ~ /^OOZIE\-/) {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 ${TEMPDIR} 2>&1 $STDOUT

parseArgs "$@"

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

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

findAndSubmitAvailablePatches

exit 0
