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

#
# Pull request applier.
#

#
# Start of Functions.
#

#
# Prints usage.
#
usage () {
    echo 'Usage: scripts/apply-pull-request.sh <pull-request-id> [-tb|--targetbranch <branch-name>] [--with-gpg] [-s|--sign-off]'
    echo 'The script takes pull-request by given id and merges (with squash) all changes to target branch (master by default).'
    echo "Argument 'pull-request-id' is mandatory."
    echo "Target branch can be overwritten by using [-tb|--targetbranch <branch-name>] argument paramethers."
}

#
# End of Functions.
#

if [ "${GIT_HOME}" = "" ]; then
    GIT_HOME="$(dirname "$(cd "$(dirname "$0")"; "pwd")")";
fi

cd "${GIT_HOME}" || { echo "failed to change director ${GIT_HOME}"; exit 1; }

if [ "${SCRIPTS_HOME}" = "" ]; then
    SCRIPTS_HOME="${GIT_HOME}/scripts/"
fi

. "${SCRIPTS_HOME}"/git_patch_functions.sh # Import patch functions.

PR_ID=$1

#
# Start reading of command line params.
#
if [ "${PR_ID}" = "" ]; then
    echo "$0, ERROR:"
    echo >&2 "You have to specify 'pull-request-id'."
    echo
    usage
    exit 1
fi

if [ "${PR_ID}" = "-h" ]; then
    usage
    exit 0
fi

if [ "${PR_ID}" = "--help" ]; then
    usage
    exit 0
fi


while [[ $# -ge 2 ]]
do
    key="$2"

    case $key in
        -tb|--targetbranch)
        TARGET_BRANCH="$3"
        shift 2
        ;;

        --with-gpg)
        WITH_GPG="true"
        shift
        ;;

        -s|--sign-off)
        WITH_SIGN_OFF="true"
        shift
        ;;

        *)
        echo "Unknown parameter: ${key}"
        echo
        usage
        exit 1
        ;;
    esac
done
#
# Enf reading of command line params.
#


# Script variables.
if [ "${APACHE_GIT}" = "" ]; then
    APACHE_GIT="https://gitbox.apache.org/repos/asf/ignite-python-thin-client.git"
fi

if [ "${GITHUB_MIRROR}" = "" ]; then
    GITHUB_MIRROR="git@github.com:apache/ignite-python-thin-client.git"
fi

if [ "${TARGET_BRANCH}" = "" ]; then
    TARGET_BRANCH="master"
fi

requireCleanWorkTree "${GIT_HOME}"

CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)

if [ "$CURRENT_BRANCH" != "${TARGET_BRANCH}" ]; then
    echo "$0, ERROR:"
    echo "You have to be on ${TARGET_BRANCH} branch."

    exit 1
fi

# Check that target branch is up-to-date.
APACHE_GIT_TARGET_BRANCH="apache-git-target-br-tmp"

git fetch ${APACHE_GIT} ${TARGET_BRANCH}:${APACHE_GIT_TARGET_BRANCH} &> /dev/null
if test $? != 0; then
    echo "$0, ERROR:"
    echo >&2 "Couldn't fetch '${TARGET_BRANCH}' branch from ${APACHE_GIT}."
    exit 1
fi

LOCAL_TARGET_BR_HASH=$(git rev-parse @)
REMOTE_TARGET_BR_HASH=$(git rev-parse ${APACHE_GIT_TARGET_BRANCH})
BASE_HASH=$(git merge-base @ ${APACHE_GIT_TARGET_BRANCH})

git branch -D ${APACHE_GIT_TARGET_BRANCH} &> /dev/null

if [ "$LOCAL_TARGET_BR_HASH" != "$REMOTE_TARGET_BR_HASH" ]; then
    echo "$0, ERROR:"

    if [ "$LOCAL_TARGET_BR_HASH" = "$BASE_HASH" ]; then
        echo "Your local ${TARGET_BRANCH} branch is not up-to-date. You need to pull."
    elif [ "$REMOTE_TARGET_BR_HASH" = "$BASE_HASH" ]; then
        echo "Your local ${TARGET_BRANCH} branch is ahead of ${TARGET_BRANCH} branch at Apache git. You need to push."
    else
        echo "Your local ${TARGET_BRANCH} and Apache git ${TARGET_BRANCH} branches diverged. You need to pull, merge and pull."
    fi

    exit 1
fi

echo "Local ${TARGET_BRANCH} is Up-to-date."
echo

# Checkout pull-request branch.
PR_BRANCH_NAME="pull-${PR_ID}-head"

git fetch "${GITHUB_MIRROR}" "pull/${PR_ID}/head:${PR_BRANCH_NAME}" &> /dev/null
if test $? != 0; then
    echo "$0, ERROR:"
    echo >&2 "There was not found pull request by ID = '${PR_ID}'."
    exit 1
fi

# Get author name number.
git checkout "${PR_BRANCH_NAME}" &> /dev/null
if test $? != 0; then
    echo "$0, ERROR:"
    echo >&2 "Failed to checkout '${PR_BRANCH_NAME}' branch (the branch not found or already exists)."
    exit 1
fi

AUTHOR="$(git --no-pager show -s --format="%aN <%aE>" HEAD)"
ORIG_COMMENT="$(git log -1 --pretty=%B)"

echo "Author of pull-request: '$AUTHOR'."
echo

# Update local target branch.
git checkout ${TARGET_BRANCH} &> /dev/null

# Take changes.
git merge --squash "${PR_BRANCH_NAME}" &> /dev/null
if test $? != 0; then
    git reset --hard &> /dev/null

    echo "$0, ERROR:"
    echo >&2 "Could not merge the pull-request to ${TARGET_BRANCH} without conflicts. All local changes have been discarded. You're on ${TARGET_BRANCH} branch."
    exit 1
fi

echo "Original comment is"
echo "\"${ORIG_COMMENT}\""
echo "Press [ENTER] if you're agree with the comment or type your comment and press [ENTER]:"
read -r COMMENT
echo

if [ "${COMMENT}" == "" ]; then
    COMMENT=${ORIG_COMMENT}
fi

COMMENT="${COMMENT} - Fixes #${PR_ID}."

if [ "${EXCLUDE_SPECIAL_FILE}" = "true" ]; then
    git checkout HEAD ignite-pull-request-id
fi

SIGN_OPTION=""
if [ -n "${WITH_GPG}" ]; then
  SIGN_OPTION="-S"
fi

if [ -n "${WITH_SIGN_OFF}" ]; then
  SIGN_OPTION="${SIGN_OPTION} -s"
fi

git commit --author "${AUTHOR}" -a ${SIGN_OPTION} -m "${COMMENT}" &> /dev/null

echo "Squash commit for pull request with id='${PR_ID}' has been added. The commit has been added with comment '${COMMENT}'."
echo "Now you can review changes of the last commit at ${TARGET_BRANCH} and push it into ${APACHE_GIT} git after."
echo "If you want to decline changes, you can remove the last commit from your repo by 'git reset --hard HEAD^'."
echo

# Clean-up.
git branch -D "${PR_BRANCH_NAME}" &> /dev/null

echo 'Successfully completed.'
