blob: ea8f9f605147f5b056818b31bf77ce159cddda46 [file] [log] [blame]
#!/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 http://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