<!--
   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:ea="http://www.easyant.org">
    <info organisation="org.apache.easyant.plugins" module="ivy-repo-management" revision="0.9">
        <extends organisation="org.apache.easyant.plugins" module="parent-plugin" revision="0.1" location="../parent.ivy" />
        <description>
            <p>
                This module provides features to install artifacts on a given repository.
                <br />
                This module can be used in interactive (ie. let easyant ask questions) or directly from the command line
                by settings -Dproperty.
                <br />
                By default interactive mode is enabled.
                <br />
                If you prefer you can directly set the property on the command line.
                <br />
            </p>
            <p>
                Example:
                <div class="code">
                    easyant install-ext-artifact -Dorg=myOrgName -Dmodule=myModuleName -Drev=myRevisionNumber
               </div>
                Example2:
                <div class="code">
                    easyant install-artifact -Dorg=myOrgName -Dmodule=myModuleName -Drev=myRevisionNumber
                    -Dartifact=myFile
               </div>
            </p>
            <p>
                If one of the property is not set, easyant will ask you the question if interactive mode is set to
                "true".
                If you want to disable interactive mode you should set "install.interactive.mode" property to
                "false".
           </p>
        </description>
        <ea:build organisation="org.apache.easyant.buildtypes" module="build-std-ant-plugin" revision="0.1" />
    </info>
    <configurations>
        <conf name="default" description="runtime dependencies artifact can be used with this conf" />
        <conf name="test"
            description="this scope indicates that the dependency is not required for normal use of the application, and is only available for the test compilation and execution phases." />
        <conf name="provided"
            description="this is much like compile, but indicates you expect the JDK or a container to provide it. It is only available on the compilation classpath, and is not transitive." />
    </configurations>
    <publications>
        <artifact type="ant" />
        <artifact name="ivy.xml" type="tpl" />
    </publications>
</ivy-module>