#
# 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:
  - 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}")
  - if [ "${GENERATE_DOCS}" = "true"  ] ; then mvn_opts=(${mvn_opts[@]} "-Pweb-documentation") ; fi
#  - chmod +x ./docs/script/cibuild
script:
  #- jdk_switcher use openjdk8
  - bin/change-scala-version.sh 2.11.8 && mvn clean install -Pdistro "${mvn_opts[@]}" &> result.log
  - 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 a update of the documentation if something change there
  - if [ "${GENERATE_DOCS}" = "true" ] ; then mvn gem:exec@generate-documentation gem:exec@generate-documentation-as-latest site:site -pl wayang-docs -Pweb-documentation ; fi

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