# 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: go

_addons: &addon_conf
  apt:
    sources:
      - ubuntu-toolchain-r-test
    packages:
      - gcc-7-multilib
      - linux-libc-dev:i386

go:
  - "1.12"

git:
  depth: false

matrix:
  include:
    # Style checking
    - os: linux
      language: python
      python:
        - "3.5"
      addons:
        apt:
          packages:
            - "python3-pip"
      env:
        - TEST=STYLE
        - DEBUG=1

    # RAT Report
    - os: linux
      language: python
      python:
        - "3.5"
      env:
        - TEST=RAT
        - DEBUG=1

    # newt build <targets>
    - os: linux
      env:
        - TEST=BUILD_TARGETS
        - VM_AMOUNT=4
        - TARGET_SET=1
    - os: linux
      env:
        - TEST=BUILD_TARGETS
        - VM_AMOUNT=4
        - TARGET_SET=2
    - os: linux
      env:
        - TEST=BUILD_TARGETS
        - VM_AMOUNT=4
        - TARGET_SET=3
    - os: linux
      env:
        - TEST=BUILD_TARGETS
        - VM_AMOUNT=4
        - TARGET_SET=4

    # newt build <blinky-for-BSP>
    - os: linux
      env:
        - TEST=BUILD_BLINKY
        - VM_AMOUNT=4
        - TARGET_SET=1
    - os: linux
      env:
        - TEST=BUILD_BLINKY
        - VM_AMOUNT=4
        - TARGET_SET=2
    - os: linux
      env:
        - TEST=BUILD_BLINKY
        - VM_AMOUNT=4
        - TARGET_SET=3
    - os: linux
      env:
        - TEST=BUILD_BLINKY
        - VM_AMOUNT=4
        - TARGET_SET=4

    # newt test all (Linux)
    - os: linux
      addons: *addon_conf
      env:
        - TEST=TEST_ALL
        - VM_AMOUNT=3
        - TARGET_SET=1
    - os: linux
      addons: *addon_conf
      env:
        - TEST=TEST_ALL
        - VM_AMOUNT=3
        - TARGET_SET=2
    - os: linux
      addons: *addon_conf
      env:
        - TEST=TEST_ALL
        - VM_AMOUNT=3
        - TARGET_SET=3

    # newt test all (osx)
    - os: osx
      osx_image: xcode9.2
      env:
        - TEST=TEST_ALL
        - VM_AMOUNT=3
        - TARGET_SET=1
    - os: osx
      osx_image: xcode9.2
      env:
        - TEST=TEST_ALL
        - VM_AMOUNT=3
        - TARGET_SET=2
    - os: osx
      osx_image: xcode9.2
      env:
        - TEST=TEST_ALL
        - VM_AMOUNT=3
        - TARGET_SET=3
    - os: windows
      env:
        - TEST=BUILD_TARGETS_WINDOWS
        - VM_AMOUNT=1
        - TARGET_SET=1

before_install:
  - printenv
  - export GOPATH=$HOME/gopath
  - if [ "${TEST}" != "RAT" && "${TEST}" != "STYLE" ]; then go version; fi

install:
  - git clone https://github.com/JuulLabs-OSS/mynewt-travis-ci $HOME/ci
  - chmod +x $HOME/ci/*.sh
  - |
    if [ "${TEST}" == "RAT" ]; then
      pip install requests
    elif [ "${TEST}" == "STYLE" ]; then
      pip3 install requests
    else
      $HOME/ci/${TRAVIS_OS_NAME}_travis_install.sh
    fi

before_script:
  - |
    if [ "${TEST}" == "STYLE" ]; then
      $HOME/ci/install_uncrustify.sh
    elif [ "${TEST}" != "RAT" ]; then
      newt version
      gcc --version
      if [ "${TEST}" != "TEST_ALL" ]; then arm-none-eabi-gcc --version; fi
      cp -R $HOME/ci/mynewt-core-project.yml project.yml
      mkdir -p targets
      cp -R $HOME/ci/mynewt-core-targets targets
      newt upgrade
      # pass in the number of target sets
      $HOME/ci/prepare_test.sh $VM_AMOUNT
    fi

script:
  # the following list of targets are known to fail building blinky, or
  # might have extra dependencies hard to provide, non-common toolchains, etc
  # NOTE: "native" is here to avoid having to install gcc-multilib
  - export IGNORED_BSPS="ci40 embarc_emsk hifive1 native-armv7 native-mips
                         pic32mx470_6lp_clicker pic32mz2048_wi-fire sensorhub
                         native"
  - |
    if [ "${TEST}" == "STYLE" ]; then
      python3 $HOME/ci/check_style.py
    elif [ "${TEST}" == "RAT" ]; then
      python $HOME/ci/check_license.py
    else
      $HOME/ci/run_test.sh
    fi

cache:
  directories:
  - $HOME/TOOLCHAIN
  - $HOME/Library/Caches/Homebrew
