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

matrix:
  include:
    - os: linux
      sudo: required
      go: "1.9.3"
      services: docker
      dist: xenial

env:
  global:
    - secure: "Br0fD9CAKm8gqyEuwmltNJd4dGJCxPpj6feugHlO+CFFwfE/+kJKkpTlsDuRfrUzUDlWiETNPf0XGSjvPFqZExnLCE9XQh2+XF6u+S3YBWfM+rbbyRVAK6BlTwmt0u3jRJ2JP7spedTGZA+qfIWI+UkwoOexo7NcqtMPLahiZzheaaad8y3J+crHQCrB/kPrhLqKVMEOkIbveFdfV2QLfCOWgqP8e1LGZhPZ2N4QcNo0iB5uI4ZyYszTZDniXFKxz7kBs4tl4ZQDqRHqL02qKPsjbvjrZp83ql+PbC2dpgXi9YpaDuBEqKKX1rTQP5ppcwbobot5U3ItHWzpXbLCdsWxvbde/0enjMmOF1wwl71hPYIf7PkQmNAWXRtL2Z1TguO/dKCeXBLDER4YDQ79GYpikAMqnrRLou4rsyZrNUzg8aHbELzAHppDSpqEJN8ymGgWgmWBT8yPaWVwN5CjPFOxLPrVEObcwcNSGOcOvtmUGCnXKSZminNZUjz5QfWqpA+LYCUIbeOI2X2D+iQWklWONaU2A+PcNLaaegwwj4K+9ZlU08Ed8Ud5ZGhjN9s72OtoFPdSHAyBgf/qxIdnTzmmE+SQ90mDtG3VqjHy28Ix7cIGqaIEC8shFb0kKHqQ7AVkLPm0bsh2fbbYu/5YVpXHfxlKWfOLBV14bHUq3v0="
    - build_file_name=wsk
    # WARNING: if zip_file_name includes spaces or leading hyphen(s), it will create cosmetic breakage in 'before_deploy'
    - zip_file_name=OpenWhisk_CLI

git:
  depth: 3

notifications:
  email: false
  webhooks:
    urls:
      # travis2slack webhook to enable DMs on openwhisk-team.slack.com to PR authors with TravisCI results
      secure: "nv1E5INzU77zNDxNj/aNI9nutdSq4Fv2o9JUSmb0C0/OAs/0iXHGL1UVSdyIjQ6RozOmd2rped5/n9pgqPDk4FaYfyVv+80k6KNdm47Yx99kOMrMyLjOV4HyYp4SmNmZVoLoYndDyyozL7NRs2fdZgk5xfnWoHSix364PVFA+gJtVFgF2vSq1cEXDLaRb21WoGpWjMQvojHiXWSdO811BpiEFruPdhfUFkU3UdzqNmz/0zW6Aj0mJTYSh+6a6j2QIN7D9tfzMNA/00g1d6VwXRokLamQFkd40hOX8Mx5h6hxdHjFSY0tdSvzCcY2jqqLZegVi9/Sm/aEM4z0VVj2/XqosASw+RB5O1R1ekOqsobf9Ru3DhLDj+frWYbLfQwJ54kQxki8bsbmxNWiK+PhKvJfq2ACTkKmGw76t6C1RJHUV2Q6o04riFlqe7T7bxKU3E6fL2fsI7zMOkjIW5MOT+iAeqzi5q8d1TDEj00Ppdi0O6v+dWzpwGXFvslClLDY5pa3BNh590kQ/CW1O6gCpQ0RIaKNvrEW0xV0rpafMThwWuO07n28KNVz/nntYAHRBIS7Pzdq1JOrvRhsCkOGiAdcQ00OmhprEBahXOGGXXqGRo0XvsaEGvcNe7yAbQ/LYtuTM0PUs54tEHSj9tbLV4ZRuL+qYNrn8gZIXtiuO54="

before_install:
  - export DEPLOY_BUILD_READY=false

install:
  - cd $TRAVIS_BUILD_DIR/..
  - pip install --user --upgrade pip setuptools

before_script:
  - cd $TRAVIS_BUILD_DIR
  - ./gradlew --console=plain checkScalafmtAll
  - GO_FILES=$(find . -iname '*.go' -type f | grep -v /vendor/)
  - test -z "$(gofmt -s -l $(echo $GO_FILES))"
  - cd $TRAVIS_BUILD_DIR/..
  - git clone https://github.com/apache/openwhisk-utilities.git
  - git clone https://github.com/apache/openwhisk.git
  - cd openwhisk
  - ./tools/travis/setup.sh

script:
  - cd $TRAVIS_BUILD_DIR/../openwhisk
  - ./gradlew install tests:buildArtifacts
  - cd $TRAVIS_BUILD_DIR
  - export BUILD_VERSION="latest"
  - if [ ! -z "$TRAVIS_TAG" ] ; then
        export BUILD_VERSION=$TRAVIS_TAG;
    fi
  - ./gradlew --console=plain releaseBinaries -PpackageVersion=$BUILD_VERSION
  - ./tools/travis/test_openwhisk.sh $BUILD_VERSION

after_success:
  - export DEPLOY_BUILD_READY=true
  - if [ "$TRAVIS_EVENT_TYPE" == "cron" ] ; then
      export DEPLOY_BUILD_READY=false;
    fi

before_deploy:
  - export RELEASE_PKG_FILE="$(cd "$TRAVIS_BUILD_DIR/release" && ls ${zip_file_name}-*.tgz ${zip_file_name}-*.zip)"
  - echo "Deploying $RELEASE_PKG_FILE to GitHub releases."
  - export GIT_TAG="latest"
  - export TAG=false;
  - if [ ! -z "$TRAVIS_TAG" ] ; then
      export GIT_TAG=$TRAVIS_TAG;
      export TAG=true;
    fi
  # This tag is automatically generated for the latest merged commit in master branch.
  - if [ "$TRAVIS_BRANCH" == "master" ] && [ "$TRAVIS_EVENT_TYPE" == "push" ] && [ "$TRAVIS_OS_NAME" == "linux" ] ; then
      git config --global user.email "builds@travis-ci.com";
      git config --global user.name "Travis CI";
      export GIT_TAG="latest";
      git tag -d $GIT_TAG;
      git push -q https://$API_KEY@github.com/apache/openwhisk-cli :refs/tags/$GIT_TAG;
      GIT_COMMITTER_DATE="$(git show --format=%aD | head -1)" git tag $GIT_TAG -a -m "Generated tag from Travis CI build $TRAVIS_BUILD_NUMBER";
      git push -f -q https://$API_KEY@github.com/apache/openwhisk-cli $GIT_TAG;
    fi
  - echo "The GIT_TAG of this Travis build is $GIT_TAG."

deploy:
  provider: releases
  api_key:
    secure: Yh1aYiM/qIWkPMSVjGUq1g9TjpACjavQ00QAqp4oqghNZc6xBcmdzsfD2VjzVPHleNI1FIZyjJ1x6laRfWBzRkAcJcjUHXA2bO/V0jqePVmgVm75WwTZ/9EaWIJeAg5CQMm5DGS28Yhc60C0ut3ZzKMWGTiKb73UADXPTGd/tjndxjfksX/THXPuInKB9QZesmluBAC2am/x/6J311WA2wqe0p1+9JFwMr8XwIcwzCwgi/d9CFpS1RnVpLE/ORSgmN/dFbZ7A/qVbx377QoxKiEB0jmUwi13f7REFAw18JdgzbQCH3X4HNu9pCJwHEAq3lP2CfmHbAXcViBeji/Xh9PPJVV9TYqO+uT8oPxCPJND1A/3O2xJ8LyZ/FP2bWqG/Ds/8SZCvxfOR/X77opUeZ4qAp7HJMVCsFi3TsnmzxCe0BOxCppVJLhoSZ2rOAPJi9mKgS/Z/VA5VhNNmnPtkReEWK4vT9h3/iCwv9anvC0RKeLckSHpCm5C5otNXtV4L990fL5L5krMatxynHnCmmhYeLg/Ns+5ncax58Y8hmhnhzTqbPGHpe79bJRfvwRI9lboq7kEj4x5O/M16TKRfQ8ZU5UHvrCPdlTfT7NUXRGZkvWX20X6Ta/DRROTF+xZGiq7da3Oi+xyNDx/LmymfR49thjzgIPXVZolknGYQ9Q=
  file_glob: true
  file:
    - release/${zip_file_name}-*.tgz
    - release/${zip_file_name}-*.zip
  overwrite: true
  skip_cleanup: true
  target_commitish: $TRAVIS_COMMIT
  tag_name: $GIT_TAG
  on:
    repo: apache/openwhisk-cli
    tags: $TAG
    condition: "$DEPLOY_BUILD_READY = true"
