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

# Configuration file for Travis continuous integration.
# See https://travis-ci.com/github/apache/calcite-avatica
language: java
matrix:
  fast_finish: true
  include:
    - install: true
      jdk: openjdk8
      env:
      script:
        - ./gradlew $GRADLE_ARGS build javadoc
    - install: true
      jdk: openjdk11
      env:
        - GUAVA=14.0.1 # oldest supported Guava version
        - TZ=Pacific/Chatham # flips between +12:45 and +13:45
      script:
        - ./gradlew $GRADLE_ARGS -Pguava.version=${GUAVA:-14.0.1} build
    - install: true
      jdk: openjdk11
      env:
        - GUAVA=19.0 # Calcite's minimum Guava version
        - TZ=America/New_York # flips between −05:00 and −04:00
      script:
        - ./gradlew $GRADLE_ARGS -Pguava.version=${GUAVA:-14.0.1} build
    - install: true
      jdk: openjdk11
      env:
        - GUAVA=23.0 # a middle-aged Guava version
      script:
        # Disable getLicenses for Guava 22..29 because of [CALCITE-4815]
        - ./gradlew $GRADLE_ARGS -Pguava.version=${GUAVA:-14.0.1} build -x :standalone-server:licenseCopySpec -x :standalone-server:getLicenses -x :standalone-server:license -x :tck:licenseCopySpec -x :tck:getLicenses -x :tck:license
    - install: true
      jdk: openjdk11
      env:
        - GUAVA=31.1-jre # newest supported Guava version
      script:
        - ./gradlew $GRADLE_ARGS -Pguava.version=${GUAVA:-14.0.1} build
    - install: true
      jdk: openjdk18
      env:
      script:
        - ./gradlew $GRADLE_ARGS build

branches:
  only:
    - main
    - javadoc
    - stage
    - /^branch-.*$/
    - /^[0-9]+-.*$/
git:
  depth: 100
before_cache:
  - F=CleanupGradleCache sh -x -c 'curl -O https://raw.githubusercontent.com/vlsi/cleanup-gradle-cache/v1.x/$F.java && javac -J-Xmx128m $F.java && java -Xmx128m $F'
cache:
  directories:
    - $HOME/.gradle/caches/
    - $HOME/.gradle/wrapper/
