#!/usr/bin/env bash
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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.


# Invoke Yetus locally to validate a patch against Lucene/Solr, and
# (optionally) post a validation report comment on the passed-in JIRA issue
# from which the patch was downloaded.
#
# NB 1: The Lucene/Solr Yetus personality currently performs the equivalent
# of "ant precommit" and "ant test" in modified modules; instead of using
# this script to test your changes, please consider invoking those targets
# directly.
#
# NB 2: The Jenkins job "PreCommit-Admin" automatically detects new patches
# posted to LUCENE and SOLR JIRA issues that are in the "Patch Available"
# state, and then queues the appropriate "PreCommit-LUCENE-Build" or
# "PreCommit-SOLR-Build" job pointing to the JIRA hosting the new patch.
# Those jobs perform the same checks as this script, and like this script,
# will post a comment on the JIRA issue.  As a result, manual invocation
# (e.g. via this script) should ordinarily not be necessary.
#
# Environment variable ${YETUS_HOME} must point to the separately installed
# Yetus home directory, e.g. the "rel/0.7.0" tag checked out from a local
# Yetus Git repository.
#
# Environment variable ${PROJECT_DIR} must point to a local Lucene/Solr git
# workspace dir.
#
# The sole cmdline param can be a JIRA issue, a local patch file,
# or a URL to a patch file.
#
# If the cmdline param is a JIRA issue, the patch to download and validate
# will be the most recently uploaded patch on the issue.  See the patch
# naming schema that Yetus recognizes:
# https://yetus.apache.org/documentation/in-progress/precommit-patchnames/
#
# If the cmdline param is a JIRA issue and you provide JIRA user/password via
# environment variables ${JIRA_USER} and ${JIRA_PASSWORD}, a patch validation
# report will be posted as a comment on the JIRA issue.

help () {
  echo "Usage 1: [ JIRA_USER=xxx JIRA_PASSWORD=yyy ] PROJECT_DIR=/path/to/lucene-solr YETUS_HOME=/path/to/yetus $0 SOLR-12345"
  echo "Usage 2: [ JIRA_USER=xxx JIRA_PASSWORD=yyy ] PROJECT_DIR=/path/to/lucene-solr YETUS_HOME=/path/to/yetus $0 LUCENE-12345"
  echo "Usage 3: PROJECT_DIR=/path/to/lucene-solr YETUS_HOME=/path/to/yetus $0 ../local.patch"
  echo "Usage 4: PROJECT_DIR=/path/to/lucene-solr YETUS_HOME=/path/to/yetus $0 http://example.com/remote.patch"
}

if [[ -z "${PROJECT_DIR}" || -z "${YETUS_HOME}" || -z "${1}" || "${1}" =~ ^-(-?h(elp)?|\?)$ ]] ; then
  help
  exit 1
fi

PATCH_REF=${1}
TEST_PATCH_BIN="${YETUS_HOME}/precommit/test-patch.sh"
SCRIPT_DIR="$( cd "$( dirname "${0}" )" && pwd )"
declare -a YETUS_ARGS

if [[ ${PATCH_REF} =~ ^(LUCENE|SOLR)- ]]; then
  JIRA_PROJECT=${BASH_REMATCH[0]}
  YETUS_ARGS+=("--project=${JIRA_PROJECT}")

  if [[ -n "${JIRA_USER}" ]] && [[ -n "${JIRA_PASSWORD}" ]] ; then
    YETUS_ARGS+=("--jira-user=${JIRA_USER}")
    YETUS_ARGS+=("--jira-password=${JIRA_PASSWORD}")
    YETUS_ARGS+=("--bugcomments=jira")
  fi
fi

YETUS_ARGS+=("--basedir=${PROJECT_DIR}")
YETUS_ARGS+=("--personality=${SCRIPT_DIR}/lucene-solr-yetus-personality.sh")
YETUS_ARGS+=("--skip-dirs=dev-tools")
YETUS_ARGS+=("--resetrepo")
YETUS_ARGS+=("--run-tests")
YETUS_ARGS+=("--debug")
YETUS_ARGS+=("--robot")
YETUS_ARGS+=("${PATCH_REF}")

/bin/bash ${TEST_PATCH_BIN} "${YETUS_ARGS[@]}"
