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

dist: focal

language: minimal

cache:
  directories:
    - $TRAVIS_BUILD_DIR/.docker

addons:
  apt:
    packages:
      - python3-pip

services:
  - docker

# Note that the global "env" setting isn't inherited automatically by
# matrix entries with their own "env", so we have to insert it explicitly.
env: &global_env
  ARROW_ENABLE_TIMING_TESTS: "OFF"
  COMPOSE_DOCKER_CLI_BUILD: 1
  DOCKER_BUILDKIT: 0
  DOCKER_VOLUME_PREFIX: $TRAVIS_BUILD_DIR/.docker/

jobs:
  include:
    - name: "C++ on s390x"
      os: linux
      arch: s390x
      env:
        <<: *global_env
        ARCH: s390x
        ARROW_CI_MODULES: "CPP"
        DOCKER_IMAGE_ID: ubuntu-cpp
        # Can't enable ARROW_MIMALLOC because of failures in memory pool tests.
        # Can't enable ARROW_S3 because compiler is killed while compiling
        # aws-sdk-cpp.
        DOCKER_RUN_ARGS: >-
          "
          -e ARROW_FLIGHT=ON
          -e ARROW_GCS=OFF
          -e ARROW_MIMALLOC=OFF
          -e ARROW_ORC=OFF
          -e ARROW_PARQUET=OFF
          -e ARROW_S3=OFF
          -e ARROW_SUBSTRAIT=OFF
          -e CMAKE_BUILD_PARALLEL_LEVEL=2
          -e CMAKE_UNITY_BUILD=ON
          -e PARQUET_BUILD_EXAMPLES=OFF
          -e PARQUET_BUILD_EXECUTABLES=OFF
          -e Protobuf_SOURCE=BUNDLED
          -e gRPC_SOURCE=BUNDLED
          "
        # The LLVM's APT repository causes download error for s390x binary
        # We should use the LLVM provided by the default APT repository
        CLANG_TOOLS: "10"
        LLVM: "10"
        UBUNTU: "20.04"

    - name: "Go on s390x"
      os: linux
      arch: s390x
      env:
        <<: *global_env
        ARCH: s390x
        ARROW_CI_MODULES: "GO"
        DOCKER_IMAGE_ID: debian-go

    - name: "Java on s390x"
      os: linux
      arch: s390x
      env:
        <<: *global_env
        ARCH: s390x
        ARROW_CI_MODULES: "JAVA"
        DOCKER_IMAGE_ID: debian-java
        JDK: 11

    - name: "Python on s390x"
      os: linux
      arch: s390x
      env:
        <<: *global_env
        ARCH: s390x
        ARROW_CI_MODULES: "PYTHON"
        DOCKER_IMAGE_ID: ubuntu-python
        # Can't enable ARROW_MIMALLOC because of failures in memory pool tests.
        # Can't enable ARROW_S3 because compiler is killed while compiling
        # aws-sdk-cpp.
        DOCKER_RUN_ARGS: >-
          "
          -e ARROW_FLIGHT=ON
          -e ARROW_GCS=OFF
          -e ARROW_MIMALLOC=OFF
          -e ARROW_ORC=OFF
          -e ARROW_PARQUET=OFF
          -e ARROW_PYTHON=ON
          -e ARROW_S3=OFF
          -e CMAKE_BUILD_PARALLEL_LEVEL=2
          -e CMAKE_UNITY_BUILD=ON
          -e PARQUET_BUILD_EXAMPLES=OFF
          -e PARQUET_BUILD_EXECUTABLES=OFF
          -e Protobuf_SOURCE=BUNDLED
          -e gRPC_SOURCE=BUNDLED
          "
        # The LLVM's APT repository causes download error for s390x binary
        # We should use the LLVM provided by the default APT repository
        CLANG_TOOLS: "10"
        LLVM: "10"
        UBUNTU: "20.04"

  allow_failures:
    - name: "Java on s390x"
    - name: "C++ on s390x"
    - name: "Python on s390x"

before_install:
  - eval "$(python ci/detect-changes.py)"
  - |
    arrow_ci_affected=no
    for arrow_ci_module in ${ARROW_CI_MODULES}; do
      arrow_ci_affected_variable=ARROW_CI_${arrow_ci_module}_AFFECTED
      if [ "$(eval "echo \$${arrow_ci_affected_variable}")" = "1" ]; then
        arrow_ci_affected=yes
      fi
    done
    if [ "${arrow_ci_affected}" = "no" ]; then
      travis_terminate 0
    fi

install:
  - sudo -H pip3 install --upgrade pip
  - sudo -H pip3 install 'docker-compose>=1.27.0'
  - sudo -H pip3 install -e dev/archery[docker]

script:
  - export ARCHERY_DEFAULT_BRANCH=$(git rev-parse --abbrev-ref origin/HEAD | sed s@origin/@@)
  - |
    archery docker run \
      ${DOCKER_RUN_ARGS} \
      --volume ${PWD}/build:/build \
      ${DOCKER_IMAGE_ID}

after_success:
  - |
    if [ "${TRAVIS_EVENT_TYPE}" = "push" -a \
         "${TRAVIS_REPO_SLUG}" = "apache/arrow" ]; then
      archery docker push ${DOCKER_IMAGE_ID} || :
    fi
