#!/usr/bin/env 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
