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


#
# QA check your changes.
# Possible options:
# BRANCH set a another branch as the "check" reference
#
#
# Use the tool like this "BRANCH=release-0.8 ./tools/qa-check.sh"
#


BRANCH=${BRANCH:-origin/master}



here="`dirname \"$0\"`"				# relative
here="`( cd \"$here\" && pwd )`" 	# absolutized and normalized
if [ -z "$here" ] ; then
	# error; for some reason, the path is not accessible
	# to the script (e.g. permissions re-evaled after suid)
	exit 1  # fail
fi
flink_home="`dirname \"$here\"`"

cd $here

if [ ! -d  "_qa_workdir" ] ; then
	echo "_qa_workdir doesnt exist. Creating it"
	mkdir _qa_workdir
fi

cd _qa_workdir

if [ ! -d  "flink" ] ; then
	echo "There is no flink copy in the workdir. Cloning flink"
	git clone https://git-wip-us.apache.org/repos/asf/flink.git flink
fi

cd flink
# fetch and checkout quietly
git fetch -q origin
git checkout -q $BRANCH
cd $here
# go to refrence flink directory

cd _qa_workdir
VAR_DIR=`pwd`
cd flink

# Initialize variables
export TESTS_PASSED=true
# Store output of results in a file in the qa dir
QA_OUTPUT="$VAR_DIR/qa_results.txt"
rm -f "$QA_OUTPUT"

append_output() {
	echo "$1"
	echo "$1" >> "$QA_OUTPUT"
}

goToTestDirectory() {
	cd $flink_home
}

############################ Methods ############################

############ Javadocs ############
JAVADOC_MVN_COMMAND="mvn javadoc:aggregate -Pdocs-and-source -Dmaven.javadoc.failOnError=false -Dquiet=false | grep  \"WARNING\|warning\|error\" | wc -l"

referenceJavadocsErrors() {
	eval $JAVADOC_MVN_COMMAND > "$VAR_DIR/_JAVADOCS_NUM_WARNINGS"
}


checkJavadocsErrors() {
	OLD_JAVADOC_ERR_CNT=`cat $VAR_DIR/_JAVADOCS_NUM_WARNINGS` 
	NEW_JAVADOC_ERR_CNT=`eval $JAVADOC_MVN_COMMAND`
	if [ "$NEW_JAVADOC_ERR_CNT" -gt "$OLD_JAVADOC_ERR_CNT" ]; then
		append_output ":-1: The change increases the number of javadoc errors from $OLD_JAVADOC_ERR_CNT to $NEW_JAVADOC_ERR_CNT"
		TESTS_PASSED=false
	else
		append_output ":+1: The number of javadoc errors was $OLD_JAVADOC_ERR_CNT and is now $NEW_JAVADOC_ERR_CNT"
	fi
}


############ Compiler warnings ############
COMPILER_WARN_MVN_COMMAND="mvn clean compile -Dmaven.compiler.showWarning=true -Dmaven.compiler.showDeprecation=true | grep \"WARNING\""
referenceCompilerWarnings() {
	eval "$COMPILER_WARN_MVN_COMMAND | tee $VAR_DIR/_COMPILER_REFERENCE_WARNINGS | wc -l" > "$VAR_DIR/_COMPILER_NUM_WARNINGS"
}

checkCompilerWarnings() {
	OLD_COMPILER_ERR_CNT=`cat $VAR_DIR/_COMPILER_NUM_WARNINGS` 
	NEW_COMPILER_ERR_CNT=`eval $COMPILER_WARN_MVN_COMMAND | tee $VAR_DIR/_COMPILER_NEW_WARNINGS | wc -l`
	if [ "$NEW_COMPILER_ERR_CNT" -gt "$OLD_COMPILER_ERR_CNT" ]; then
		append_output ":-1: The change increases the number of compiler warnings from $OLD_COMPILER_ERR_CNT to $NEW_COMPILER_ERR_CNT"
		append_output '```diff'
		append_output "First 100 warnings:"
		append_output "`diff $VAR_DIR/_COMPILER_REFERENCE_WARNINGS $VAR_DIR/_COMPILER_NEW_WARNINGS | head -n 100`"
		append_output '```'
		TESTS_PASSED=false
	else
		append_output ":+1: The number of compiler warnings was $OLD_COMPILER_ERR_CNT and is now $NEW_COMPILER_ERR_CNT"
	fi
}

############ Files in lib ############
BUILD_MVN_COMMAND="mvn clean package -DskipTests -Dmaven.javadoc.skip=true"
COUNT_LIB_FILES="find . | grep \"\/lib\/\" | grep -v \"_qa_workdir\" | wc -l"
referenceLibFiles() {
	eval $BUILD_MVN_COMMAND > /dev/null
	eval $COUNT_LIB_FILES > "$VAR_DIR/_NUM_LIB_FILES"
}

checkLibFiles() {
	OLD_LIB_FILES_CNT=`cat $VAR_DIR/_NUM_LIB_FILES` 
	eval $BUILD_MVN_COMMAND > /dev/null
	NEW_LIB_FILES_CNT=`eval $COUNT_LIB_FILES`
	if [ "$NEW_LIB_FILES_CNT" -gt "$OLD_LIB_FILES_CNT" ]; then
		append_output ":-1: The change increases the number of dependencies in the lib/ folder from $OLD_LIB_FILES_CNT to $NEW_LIB_FILES_CNT"
		TESTS_PASSED=false
	else
		append_output ":+1: The number of files in the lib/ folder was $OLD_LIB_FILES_CNT before the change and is now $NEW_LIB_FILES_CNT"
	fi
}

############ @author tag ############

checkAuthorTag() {
	# we are grep-ing for "java" but we've messed up the string a bit so that it doesn't find exactly this line.
	if [ `grep -r "@author" . | grep "ja""va" | wc -l` -gt "0" ]; then
		append_output ":-1: The change contains @author tags"
		TESTS_PASSED=false
	fi
}


################################### QA checks ###################################

append_output "Computing Flink QA-Check results (please be patient)."

##### Methods to be executed on the current 'master'
referenceJavadocsErrors
referenceCompilerWarnings
referenceLibFiles


goToTestDirectory
## Methods to be executed on the changes (flink root dir)
checkJavadocsErrors
checkCompilerWarnings
checkLibFiles
checkAuthorTag


append_output "QA-Check finished."
if [ "$TESTS_PASSED" == "true" ]; then
	append_output "Overall result: :+1:. All tests passed"
else 
	append_output "Overall result: :-1:. Some tests failed. Please check messages above"
fi
