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

# This script will run pre-installations and run release build.

set -e

GIT_REPO_URL=https://github.com/apache/beam.git
LOCAL_CLONE_DIR=release_build
BEAM_ROOT_DIR=beam

echo "Which branch you want to verify release build: "
read branch

echo "=====================Environment Variables====================="
echo "working branch: ${branch}"
echo "local repo dir: ~/${LOCAL_CLONE_DIR}/${BEAM_ROOT_DIR}"

echo "====================Checking Requirement======================="

echo "====================Checking pip==============================="
if [[ -z `which pip` ]]; then
  echo "There is no pip installed on your machine."
  echo "Would you like to install pip with root permission? [y|N]"
  read confirmation
  if [[ $confirmation != "y" ]]; then
    echo "Refused to install pip on your machine. Exit."
    exit
  else
    echo "==================Installing pip========================="
    curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
    sudo python get-pip.py
    rm get-pip.py
  fi
else
  pip --version
fi

echo "====================Checking virtualenv========================"
if [[ -z `which virtualenv` ]]; then
  echo "There is no virtualenv installed on your machine."
  echo "Would you like to install virtualenv with root perrission? [y|N]"
  read confirmation
  if [[ $confirmation != "y" ]]; then
    echo "Refused to install virtualenv on your machine. Exit."
    exit
  else
    echo "==================Installing virtualenv==================="
    sudo `which pip` install --upgrade virtualenv
  fi
else
  virtualenv --version
fi

echo "=====================Checking cython==========================="
if [[ -z `which cython` ]]; then
  echo "There is no cython installed on your machine."
  echo "Would you like to install cython with root permission? [y|N]"
  read confirmation
  if [[ $confirmation != "y" ]]; then
    echo "Refused to install cython on your machine. Exit."
    exit
  else
    echo "==================Installing cython======================="
    sudo `which pip` install cython
    sudo apt-get install gcc
    sudo apt-get install python-dev
    sudo apt-get install python3-dev
    sudo apt-get install python3.5-dev
    sudo apt-get install python3.6-dev
    sudo apt-get install python3.7-dev
  fi
else
  cython --version
fi

echo "==================Checking /usr/bin/time========================"
if [[ `which time` != "/usr/bin/time" ]]; then
  echo "There is no usr/bin/time installed on your machine."
  echo "Would you like to install time on your machine with root permission? [y|N]"
  read confirmation
  if [[ $confirmation != "y" ]]; then
    echo "Refused to install time on your machine. Exit."
    exit
  else
    echo "==================Installing time========================="
    sudo apt-get install time
    alias time='/usr/bin/time'
  fi
else
  which time
fi

echo "=================Checking hub========================"
HUB_VERSION=2.5.0
HUB_ARTIFACTS_NAME=hub-linux-amd64-${HUB_VERSION}
if [[ -z `which hub` ]]; then
  echo "There is no hub installed on your machine."
  echo "Would you like to install hub with root permission? [y|N]"
  read confirmation
  if [[ $confirmation != "y"  ]]; then
    echo "Refused to install hub. Cannot proceed into next setp."
    exit
  fi
  echo "=================Installing hub======================="
  wget https://github.com/github/hub/releases/download/v${HUB_VERSION}/${HUB_ARTIFACTS_NAME}.tgz
  tar zvxvf ${HUB_ARTIFACTS_NAME}.tgz
  sudo ./${HUB_ARTIFACTS_NAME}/install
  echo "eval "$(hub alias -s)"" >> ~/.bashrc
  rm -rf ${HUB_ARTIFACTS_NAME}*
fi
hub version

cd ~
echo "======================Starting Clone Repo======================"
if [[ -d ${LOCAL_CLONE_DIR} ]]; then
  rm -rf ${LOCAL_CLONE_DIR}
fi
mkdir ${LOCAL_CLONE_DIR}
cd  ${LOCAL_CLONE_DIR}
git clone ${GIT_REPO_URL}
cd ${BEAM_ROOT_DIR}
git checkout ${branch}
echo "==============================================================="

echo "======================Starting Release Build==================="
git clean -fdx
./gradlew clean
# If build fails, we want to catch as much errors as possible once.
./gradlew build -PisRelease --scan --stacktrace --no-parallel --continue
echo "==============================================================="

echo "[Current Task] Run All PostCommit Tests against Release Branch"
echo "This task will create a PR against apache/beam."
echo "After PR created, you need to comment phrases listed in description in the created PR:"

echo "[Confirmation Required] Do you want to proceed? [y|N]"
read confirmation
if [[ $confirmation = "y" ]]; then
  echo "[Input Required] Please enter your github repo URL forked from apache/beam:"
  read USER_REMOTE_URL
  echo "[Input Required] Please enter your github username:"
  read GITHUB_USERNAME
  echo "[Input Required] Please enter your github token:"
  read GITHUB_TOKEN
  export GITHUB_TOKEN=${GITHUB_TOKEN}
  WORKING_BRANCH=postcommit_validation_pr
  git checkout -b ${WORKING_BRANCH}
  touch empty_file.txt
  git add empty_file.txt
  git commit -m "Add empty file in order to create PR"
  git push -f ${USER_REMOTE_URL}
  hub pull-request -o -b apache:${branch} -h ${GITHUB_USERNAME}:${WORKING_BRANCH} -F- <<<"[DO NOT MERGE] Run all PostCommit and PreCommit Tests against Release Branch

  Please comment as instructions below, one phrase per comment please:
  Run Go PostCommit
  Run Java PostCommit
  Run Java PortabilityApi PostCommit
  Run Java Flink PortableValidatesRunner Batch
  Run Java Flink PortableValidatesRunner Streaming'
  Run Apex ValidatesRunner
  Run Dataflow ValidatesRunner
  Run Flink ValidatesRunner
  Run Gearpump ValidatesRunner
  Run Dataflow PortabilityApi ValidatesRunner
  Run Samza ValidatesRunner
  Run Spark ValidatesRunner
  Run Python Dataflow ValidatesContainer
  Run Python Dataflow ValidatesRunner
  Run Python Flink ValidatesRunner
  Run Python PostCommit
  Run SQL PostCommit
  Run Go PreCommit
  Run Java PreCommit
  Run Java_Examples_Dataflow PreCommit
  Run JavaPortabilityApi PreCommit
  Run Portable_Python PreCommit
  Run Python PreCommit"

  echo "[NOTE]: Please make sure all test targets have been invoked."
  echo "Please check the test results. If there is any failure, follow the policy in release guide."
fi

echo "Do you want to clean local clone repo? [y|N]"
read confirmation
if [[ $confirmation = "y" ]]; then
  cd ~
  rm -rf ${LOCAL_CLONE_DIR}
  echo "Clean up local repo."
fi
