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

