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

language: java
jdk:
  - openjdk8
notification:
  email:
    on_success: never
    on_failure: never
  webhooks:
    urls:
      - https://webhooks.gitter.im/e/8eed86a6ecffb667b819
    on_success: never
    on_failure: never
    on_start: false
cache:
  directories:
    - .autoconf
    - $HOME/.m2

before_install:
  - echo "${GENERATE_DOCS}"
  - if [ "${GENERATE_DOCS}" = "true"  ] ; then sudo apt-get update ; fi
  - if [ "${GENERATE_DOCS}" = "true"  ] ; then sudo apt-get -y install ruby-full build-essential zlib1g-dev ; fi
  - if [ "${GENERATE_DOCS}" = "true"  ] ; then echo 'export GEM_HOME="$HOME/gems"' >> ~/.bashrc ; fi
  - if [ "${GENERATE_DOCS}" = "true"  ] ; then echo 'export PATH="$HOME/gems/bin:$PATH"' >> ~/.bashrc ; fi
  - if [ "${GENERATE_DOCS}" = "true"  ] ; then source ~/.bashrc ; fi
install:
  - if [ "${GENERATE_DOCS}" = "true"  ] ; then gem install jekyll bundler ; fi

before_script:
  - echo '<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' > ~/.m2/settings.xml
  - echo 'xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">' >> ~/.m2/settings.xml
  - echo ' <servers>' >> ~/.m2/settings.xml
  - echo '  <server>' >> ~/.m2/settings.xml
  - echo '   <id>github</id>' >> ~/.m2/settings.xml
  - echo "   <username>${GIT_USERNAME}</username>" >> ~/.m2/settings.xml
  - echo "   <password>${GIT_TOKEN}</password>" >> ~/.m2/settings.xml
  - echo '  </server>' >> ~/.m2/settings.xml
  - echo ' </servers>' >> ~/.m2/settings.xml
  - echo '</settings>' >> ~/.m2/settings.xml
  - mkdir -p travis/tmp
  - echo "#" >> travis/wayang.properties
  - echo "# Licensed to the Apache Software Foundation (ASF) under one or more" >> travis/wayang.properties
  - echo "# contributor license agreements.  See the NOTICE file distributed with" >> travis/wayang.properties
  - echo "# this work for additional information regarding copyright ownership." >> travis/wayang.properties
  - echo "# The ASF licenses this file to You under the Apache License, Version 2.0" >> travis/wayang.properties
  - echo "# (the "License"); you may not use this file except in compliance with" >> travis/wayang.properties
  - echo "# the License.  You may obtain a copy of the License at" >> travis/wayang.properties
  - echo "#" >> travis/wayang.properties
  - echo "# http://www.apache.org/licenses/LICENSE-2.0" >> travis/wayang.properties
  - echo "#" >> travis/wayang.properties
  - echo "# Unless required by applicable law or agreed to in writing, software" >> travis/wayang.properties
  - echo "# distributed under the License is distributed on an "AS IS" BASIS," >> travis/wayang.properties
  - echo "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied." >> travis/wayang.properties
  - echo "# See the License for the specific language governing permissions and" >> travis/wayang.properties
  - echo "# limitations under the License." >> travis/wayang.properties
  - echo "#" >> travis/wayang.properties
  - echo "wayang.basic.tempdir = file://$(pwd)/travis/tmp" >> travis/wayang.properties
  - echo "spark.driver.host = localhost" >> travis/wayang.properties
  - echo "spark.master = local[1]" >> travis/wayang.properties
  - echo "wayang.giraph.job.tracker = localhost:50300" >> travis/wayang.properties
  - echo "wayang.giraph.maxWorkers = 1" >> travis/wayang.properties
  - echo "wayang.giraph.minWorkers = 1" >> travis/wayang.properties
  - echo "wayang.mapreduce.job.counters.limit = 200" >> travis/wayang.properties
  - cat travis/wayang.properties
  - rm -rf /home/travis/build/apache/incubator-wayang/target/rat.txt || echo "file doesn't exist"
  - rm -rf result.log || echo "file doesn't exist"
  - export LOG_LEVEL=error
  - mvn_opts=("-Dorg.slf4j.simpleLogger.defaultLogLevel=${LOG_LEVEL}" "-Dwayang.configuration=file://$(pwd)/travis/wayang.properties" "-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=${LOG_LEVEL}" "-Dlog4j.rootLogger=${LOG_LEVEL}")
#  - chmod +x ./docs/script/cibuild
script:
  #- jdk_switcher use openjdk8
  #- mvn clean install -Pdistro,scala-11 "${mvn_opts[@]}" &> result.log
  - mvn clean install  "${mvn_opts[@]}" |& tee -a  result.log | grep --line-buffered --color=always "wayang"
  #- mvn clean install -Pdistro,scala-13 "${mvn_opts[@]}" &>> result.log # This is not working for now because of Spark and Flink not supporting Scala 2.13
  - cat /home/travis/build/apache/incubator-wayang/target/rat.txt || echo "file doesn't exist"
  - tail -n 2000 result.log

after_success:
  # generate the documentation and create an update of the documentation if something changes there
  - if [ "${GENERATE_DOCS}" = "true" ] ; then mvn clean gem:exec@bundle-install gem:exec@generate-documentation gem:exec@generate-documentation-as-latest site -pl wayang-docs -Pweb-documentation ; fi

env:
  global:
    - NOKOGIRI_USE_SYSTEM_LIBRARIES=true # speeds up installation of html-proofer
    - GENERATE_DOCS="false"
