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

# build Apache Thrift on AppVeyor - https://ci.appveyor.com

version: '0.13.0.{build}'

shallow_clone: true

branches:
  only:
    - master
    - /^(release/)?\d+\.\d+\.\d+$/

os:
  - Visual Studio 2017

matrix:
  fast_finish: true

environment:
  matrix:
   - PROFILE: MSVC2017
     PLATFORM: x64
     CONFIGURATION: Release
     BUILD_SHARED_LIBS: ON
     BOOST_VERSION: 1.67.0
     LIBEVENT_VERSION: 2.1.8
     PYTHON_VERSION: 3.6
     QT_VERSION: 5.10
     ZLIB_VERSION: 1.2.11
     DISABLED_TESTS: (StressTestNonBlocking)

   - PROFILE: MSVC2015
     PLATFORM: x86
     CONFIGURATION: Debug
     BUILD_SHARED_LIBS: OFF
     BOOST_VERSION: 1.62.0
     LIBEVENT_VERSION: 2.0.22
     PYTHON_VERSION: 3.5
     QT_VERSION: 5.8
     ZLIB_VERSION: 1.2.8
     DISABLED_TESTS: (StressTestNonBlocking)
     APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015

   - PROFILE: MINGW
     PLATFORM: x64
     CONFIGURATION: RelWithDebInfo
     DISABLED_TESTS: (StalenessCheckTest|StressTestNonBlocking)

   - PROFILE: CYGWIN
     PLATFORM: x64
     CONFIGURATION: RelWithDebInfo
     DISABLED_TESTS: (ZlibTest|OpenSSLManualInitTest|TNonblockingServerTest|StressTestNonBlocking)

install:
  - cd %APPVEYOR_BUILD_FOLDER%
  - call build\appveyor\%PROFILE:~0,4%-appveyor-install.bat
  - refreshenv

build_script:
  - cd %APPVEYOR_BUILD_FOLDER%
  - call build\appveyor\%PROFILE:~0,4%-appveyor-build.bat

test_script:
  - cd %APPVEYOR_BUILD_FOLDER%
  - call build\appveyor\%PROFILE:~0,4%-appveyor-test.bat


# artifact capture disabled as it might increase service cost for little gain:
#
# artifacts:
#  - path: local-thrift-inst
#    name: cmake installed content
#    type: zip
#
#  - path: local-thrift-build\Testing
#    name: ctest output
#    type: zip

# RDP support: use one or the other...
#
# enables RDP for each build job so you can inspect the environment at the beginning of the job:
# init:
#  - ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
#
# enables RDP at the end of the build job so you can login and re-run
# commands to see why something failed...
# on_finish:
#   - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
#
# also need:
# environment:
#   APPVEYOR_RDP_PASSWORD: thr1FT2345$xyzZ
