# 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.
version: '{build}'
os: Windows Server 2012
init:		
 - git config --global core.autocrlf true
install:
  - cinst git
  - ps: |
      Add-Type -AssemblyName System.IO.Compression.FileSystem
      if (!(Test-Path -Path "C:\maven" )) {
        (new-object System.Net.WebClient).DownloadFile('https://www.apache.org/dist/maven/maven-3/3.5.3/binaries/apache-maven-3.5.3-bin.zip', 'C:\maven-bin.zip')
        [System.IO.Compression.ZipFile]::ExtractToDirectory("C:\maven-bin.zip", "C:\maven")
      }
  - cmd: SET PATH=C:\maven\apache-maven-3.5.3\bin;%JAVA_HOME%\bin;=%;
  - cmd: SET JAVA_HOME=C:\Program Files\Java\jdk1.7.0
  - cmd: SET M2_HOME=C:\maven\apache-maven-3.5.3
  - cmd: SET MAVEN_OPTS=-Xmx4g
  - cmd: SET JAVA_OPTS=-Xmx4g
build_script:
  - mvn --show-version --quiet -T 1C -PskipTests,all --batch-mode
test_script:
  - mvn -T 1C clean install --batch-mode
cache:
  - C:\maven\
  - C:\Users\appveyor\.m2
