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

<ivy-module version="2.0" xmlns:m="http://ant.apache.org/ivy/maven">
  <info organisation="org.apache.hcatalog"
        module="${ant.project.name}"
        revision="${hcatalog.version}">
    <license name="Apache 2.0"/>
    <ivyauthor name="Apache HCatalog Team" url="http://incubator.apache.org/hcatalog"/>
    <description>Apache HCatalog</description>
  </info>

  <configurations defaultconfmapping="default">
    <conf name="default"/>
    <conf name="test" extends="default"/>
  </configurations>

  <dependencies>
    <dependency org="org.apache.hcatalog" name="hcatalog-core" rev="${hcatalog.version}"/>
    <dependency org="org.apache.pig" name="pig" rev="${pig.version}"/>
    <!-- test dependencies -->
    <dependency org="junit" name="junit" rev="${junit.version}" conf="test->default"/>
    <dependency org="org.apache.hadoop" name="hadoop-test" rev="${hadoop20.version}" conf="test->default"/>
  </dependencies>
</ivy-module>
