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

##
## Checks for correct Scala suffixes on the Maven artifact names
##
#
# Flink must only use one version of the Scala library in its classpath. The
# Scala library is compatible across minor versions, i.e. any 2.10.X release
# may be freely mixed. However, 2.X and 2.Y are not compatible with each other.
# That's why we suffix the Maven modules which depend on Scala with the Scala
# major release version.
#
# This script uses Maven's dependency plugin to get a list of modules which
# depend on the Scala library. Further, it checks whether all modules have
# correct suffixes, i.e. modules with Scala dependency should carry a suffix
# but modules without Scala should be suffix-free.
#
# The script may be run from the /tools directory or the Flink root. Prior to
# executing the script it is advised to run 'mvn clean install -DskipTests' to
# build and install the latest version of Flink.
#
# The script uses 'mvn dependency:tree -Dincludes=org.scala-lang' to list Scala
# dependent modules.
#
# Some example output:
#
### Example of a dependency-free module:
# [INFO] ------------------------------------------------------------------------
# [INFO] Building flink-java 1.0-SNAPSHOT
# [INFO] ------------------------------------------------------------------------
# [INFO]
# [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ flink-java ---
# [INFO]

### Example of a Scala dependent module:
# [INFO] ------------------------------------------------------------------------
# [INFO] Building flink-storm 1.0-SNAPSHOT
# [INFO] ------------------------------------------------------------------------
# [INFO]
# [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ flink-storm ---
# [INFO] org.apache.flink:flink-storm:jar:1.0-SNAPSHOT
# [INFO] \- org.apache.flink:flink-streaming-java:jar:1.0-SNAPSHOT:compile
# [INFO]    \- org.apache.flink:flink-runtime:jar:1.0-SNAPSHOT:compile
# [INFO]       \- org.scala-lang:scala-library:jar:2.10.4:compile
# [INFO]

MAVEN_ARGUMENTS=${1:-""}

if [[ `basename $PWD` == "tools" ]] ; then
    cd ..
fi

echo "--- Flink Scala Dependency Analyzer ---"

# Parser for mvn:dependency output

BEGIN="[INFO] Building flink"
SEPARATOR="[INFO] ------------------------------------------------------------------------"
END=$SEPARATOR

reached_block=0
in_block=0
block_name=""
block_infected=0

# exclude e2e modules and flink-docs for convenience as they
# a) are not deployed during a release
# b) exist only for dev purposes
# c) no-one should depend on them
e2e_modules=$(find flink-end-to-end-tests -mindepth 2 -maxdepth 5 -name 'pom.xml' -printf '%h\n' | sort -u | tr '\n' ',')
excluded_modules=\!${e2e_modules//,/,\!},!flink-docs,!flink-end-to-end-tests

echo "Analyzing modules for Scala dependencies using 'mvn dependency:tree'."
echo "If you haven't built the project, please do so first by running \"mvn clean install -DskipTests\""

infected=""
clean=""

while read line; do
    if [[ $line == *"$BEGIN"* ]]; then
        reached_block=1
        # Maven module name
        block_name=`[[ "$line" =~ .*(flink-?[-a-zA-Z0-9.]*).* ]] && echo ${BASH_REMATCH[1]}`
    elif [[ $line == *"$SEPARATOR"* ]] && [[ $reached_block -eq 1 ]]; then
        reached_block=0
        in_block=1
    elif [[ $line == *"$END"* ]] && [[ $in_block -eq 1 ]]; then
        if [[ $block_infected -eq 0 ]]; then
            clean="$block_name $clean"
        fi
        in_block=0
        reached_block=0
        block_name=""
        block_infected=0
    elif [[ $in_block -eq 1 ]]; then
        echo $line | grep -E "org.scala-lang|- [^:]+:[^:]+_2\.1[0-9]" | grep --invert-match "org.scala-lang.*:.*:.*:test" | grep --invert-match "[^:]*:[^:]*_2\.1[0-9]:.*:.*:test" >/dev/null
        if [ $? -eq 0 ]; then
            #echo $block_name
            infected="$block_name $infected"
            block_infected=1
        fi
    fi
done < <(run_mvn dependency:tree -Dincludes=org.scala-lang,:*_2.1*:: -pl ${excluded_modules} ${MAVEN_ARGUMENTS} | tee /dev/tty)


# deduplicate and sort
clean=`echo $clean | xargs -n1 | sort -u`

# deduplicate and sort
infected=`echo $infected | xargs -n1 | sort -u`


# #
# ### Check whether the suffixes are correct
# #

RED='\e[0;31m'
GREEN='\e[0;32m'
NC='\033[0m'

exit_code=0

echo
echo "Checking Scala-free modules:"

for module in $clean; do
    out=`find . -maxdepth 3 -name 'pom.xml' -not -path '*target*' -exec grep "${module}_\\${scala.binary.version}</artifactId>" "{}" \;`
    if [[ "$out" == "" ]]; then
        printf "$GREEN OK $NC $module\n"
    else
        printf "$RED NOT OK $NC $module\n"
        echo "$out"
        exit_code=1
    fi
done

echo
echo "Checking Scala-dependent modules:"

for module in $infected; do
    out=`find . -maxdepth 3 -name 'pom.xml' -not -path '*target*' -exec grep "${module}</artifactId>" "{}" \;`
    if [[ "$out" == "" ]]; then
        printf "$GREEN OK $NC $module\n"
    else
        printf "$RED NOT OK $NC $module\n"
        echo "$out"
        exit_code=1
    fi
done

exit $exit_code

