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

hcatalog.version=0.6.0-SNAPSHOT
jar.name=${ant.project.name}-${hcatalog.version}.jar
hcatalog.jar=${ant.project.name}-${hcatalog.version}.jar
hcatalog.core.jar=${ant.project.name}-core-${hcatalog.version}.jar
final.name=${ant.project.name}-${hcatalog.version}
package.release=1

build.dir=${basedir}/build
build.classes=${build.dir}/classes
src.dir=${basedir}/src/java
package.dir=${basedir}/src/packages
docs.src=${basedir}/src/docs
build.docs=${build.dir}/docs
build.javadoc=${build.docs}/api
dist.dir=${build.dir}/${final.name}

test.dir=${build.dir}/test
test.classes=${test.dir}/classes
test.logs=${test.dir}/logs
test.timeout=2700000
test.warehouse.dir=${test.dir}/hcat_junit_warehouse
mvnrepo=http://repo2.maven.org/maven2
test.src.dir=${basedir}/src/test
test.junit.output.format=plain
test.all.file=${test.src.dir}/all-tests
test.exclude.file=${test.src.dir}/excluded-tests
test.output=no
test.excludes=e2e/**
clover.jar=${clover.home}/lib/clover.jar
clover.db.dir=${build.dir}/test/clover/db
clover.report.dir=${build.dir}/test/clover/reports
clover.pdf.report.dir=${build.dir}/test/clover/pdf/reports

apache-rat.version=0.8

findbugs.out.dir=${test.dir}/findbugs
findbugs.exclude.file=${basedir}/src/test/findbugsExcludeFile.xml
findbugs.report.htmlfile=${findbugs.out.dir}/hcat-findbugs-report.html
findbugs.report.xmlfile=${findbugs.out.dir}/hcat-findbugs-report.xml

build.encoding=UTF8
excludes=
javac.debug=on
javac.optimize=on
javac.deprecation=off
javac.version=1.6
javac.args=
javac.args.warnings=

# hive properties
#shims.name=20
shims.20S.hive.shims.include=0.20,0.20S
shims.20S.hadoop.version=${hive.hadoop-0.20S.version}
shims.23.hive.shims.include=0.23
shims.23.hadoop.version=${hive.hadoop-0.23.version}

###############################################################################
# deploy properties
#
# "Maven Ant Tasks" are used to publish artifacts to maven repositories. This
# means your ~/.m2/settings.xml file must contain the appropriate credentials
# matching the mvn.deploy.repo.id you choose to publish to.
#
# <settings>
#   <servers>
#     <server>
#       <id>apache.snapshots.https</id>
#       <username>travis</username>
#       <password>mypassword</password>
#     </server>
#   </servers>
# </settings>

mvn.deploy.repo.id=apache.snapshots.https
mvn.deploy.repo.url=https://repository.apache.org/content/repositories/snapshots
maven-ant-tasks.version=2.1.3
mvn.local.repo=${user.home}/.m2/repository
mvn.hadoop.profile=hadoop20

