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

sudo: required

services:
  - docker

cache:
  directories:
    - $HOME/arrow_docker_cache

env:
  global:
    - DOCKER_COMPOSE_VERSION=1.22.0
    - ARROW_DOCKER_CACHE_DIR=$HOME/arrow_docker_cache
{%- if environment is defined %}
  {%- for key, value in environment.items() %}
    - {{ key }}={{ value }}
  {%- endfor %}
{%- endif %}

before_install:
  - sudo rm /usr/local/bin/docker-compose
  - curl -L https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-`uname -s`-`uname -m` > docker-compose
  - chmod +x docker-compose
  - sudo mv docker-compose /usr/local/bin
  - docker -v
  - docker-compose -v

before_script:
  - git clone --no-checkout {{ arrow.remote }} arrow
  - git -C arrow fetch -t {{ arrow.remote }} {{ arrow.branch }}
  - git -C arrow checkout FETCH_HEAD
  - git -C arrow submodule update --init --recursive

script:
  - pushd arrow
{%- for command in commands %}
  - {{ command }}
{%- endfor %}
  - popd
