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

     https://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.
-->
<project name="IvyRelease" default="snapshot"
         xmlns:ivy="antlib:org.apache.ivy.ant"
         xmlns:ivy2="antlib:org.apache.ivy.ant_2"
         xmlns:asciidoctor="antlib:org.asciidoctor.ant"
         xmlns:openpgp="antlib:org.apache.commons.openpgp.ant">

    <import file="build.xml"/>

    <macrodef name="run-tutorial">
        <attribute name="antfile"/>
        <attribute name="output"/>
        <attribute name="target" default=""/>
        <attribute name="failonerror" default="true"/>
        <sequential>
            <echo>Running @{antfile} @{target} > @{output}</echo>

            <local name="antfile.dir"/>
            <dirname property="antfile.dir" file="@{antfile}"/>

            <local name="antfile.name"/>
            <basename property="antfile.name" file="@{antfile}"/>

            <echo file="@{output}">[ivy@apache:${antfile.dir}]$ ant -f ${antfile.name} @{target}${line.separator}</echo>
            <java classname="org.apache.tools.ant.launch.Launcher"
                  fork="true"
                  failonerror="@{failonerror}"
                  logerror="true"
                  append="true"
                  output="@{output}">
                <classpath>
                    <fileset file="${artifacts.build.dir}/jars/${final.name}"/>

                    <!--
                      We need to set the classpath like this, otherwise the invoked
                      build scripts are not capable of compiling sources ???
                      -->
                    <path path="${java.class.path}"/>
                </classpath>
                <sysproperty key="ivy.cache.dir" value="${tutorial.cache}"/>
                <sysproperty key="ivy.local.default.root" value="${tutorial.local-repo}"/>
                <sysproperty key="ivy.cache.ttl.default" value="1s"/>
                <sysproperty key="skip.download" value="true"/>
                <!-- We select specific HTTPS protocols, based on the Java version we are running
                    on -->
                <sysproperty key="https.protocols" value="${java.sysprop.https.protocols}"/>
                <arg line="-f @{antfile}"/>
                <arg line="@{target}"/>
            </java>
        </sequential>
    </macrodef>

    <target name="generate-tutorial-output" depends="jar" unless="skip.generate-tutorial-output">
        <property name="output.dir" value="${basedir}/asciidoc/tutorial/log"/>
        <delete dir="${output.dir}"/>
        <mkdir dir="${output.dir}"/>

        <!-- create a copy of the tutorials so we can easily get rid of the generated files -->
        <property name="tutorial.src.dir" value="${build.dir}/examples"/>
        <delete dir="${tutorial.src.dir}"/>
        <mkdir dir="${tutorial.src.dir}"/>
        <copy todir="${tutorial.src.dir}">
            <fileset dir="src/example"/>
        </copy>

        <!-- create a cache and local-repository for the tutorials -->
        <property name="tutorial.build.dir" value="${build.dir}/tutorial"/>
        <property name="tutorial.cache" value="${tutorial.build.dir}/cache"/>
        <property name="tutorial.local-repo" value="${tutorial.build.dir}/local"/>

        <!-- go-ivy : not logged, but run in order to check if it still run -->
        <run-tutorial antfile="${tutorial.src.dir}/go-ivy/build.xml" output="${output.dir}/dummy.txt"/>
        <delete file="${output.dir}/dummy.txt"/>
        <delete dir="${tutorial.build.dir}"/>

        <!-- hello-ivy : Quick Start - start.html -->
        <run-tutorial antfile="${tutorial.src.dir}/hello-ivy/build.xml" output="${output.dir}/hello-ivy-1.txt"/>
        <run-tutorial antfile="${tutorial.src.dir}/hello-ivy/build.xml" output="${output.dir}/hello-ivy-2.txt"/>
        <delete dir="${tutorial.build.dir}"/>

        <!-- multiple resolvers - multiple.html -->
        <run-tutorial antfile="${tutorial.src.dir}/chained-resolvers/chainedresolvers-project/build.xml" output="${output.dir}/chained-resolvers.txt"/>
        <delete dir="${tutorial.build.dir}"/>

        <!-- dual - dual.html -->
        <run-tutorial antfile="${tutorial.src.dir}/dual/project/build.xml" output="${output.dir}/dual.txt"/>
        <delete dir="${tutorial.build.dir}"/>

        <!-- Project dependencies - multi-project.html -->
        <run-tutorial antfile="${tutorial.src.dir}/dependence/dependee/build.xml" target="publish" output="${output.dir}/dependence-standalone.txt"/>
        <run-tutorial antfile="${tutorial.src.dir}/dependence/depender/build.xml" output="${output.dir}/dependence-depending.txt"/>
        <run-tutorial antfile="${tutorial.src.dir}/dependence/dependee/build.xml" target="publish" output="${output.dir}/dependence-standalone-2.txt"/>
        <run-tutorial antfile="${tutorial.src.dir}/dependence/depender/build.xml" output="${output.dir}/dependence-depending-2.txt"/>
        <delete dir="${tutorial.build.dir}"/>

        <!-- configuration - Using Ivy Configuration - conf.html -->
        <run-tutorial antfile="${tutorial.src.dir}/configurations/multi-projects/filter-framework/build.xml" output="${output.dir}/configurations-lib.txt"/>
        <run-tutorial antfile="${tutorial.src.dir}/configurations/multi-projects/myapp/build.xml" output="${output.dir}/configurations-runcc.txt"/>
        <run-tutorial antfile="${tutorial.src.dir}/configurations/multi-projects/myapp/build.xml" target="run-hm" output="${output.dir}/configurations-runhm.txt"/>
        <delete dir="${tutorial.build.dir}"/>

        <!--Building a repository - basic.html -->
        <run-tutorial antfile="${tutorial.src.dir}/build-a-ivy-repository/build.xml" target="maven2" output="${output.dir}/install.txt"/>
        <pathconvert property="myrepository.content" pathsep="${line.separator}">
            <fileset dir="${tutorial.src.dir}/build-a-ivy-repository/myrepository/no-namespace"/>
        </pathconvert>
        <echo file="${output.dir}/myrepository-content.txt">[ivy@apache:/]$ find ${tutorial.src.dir}/build-a-ivy-repository/myrepository/no-namespace -type f -print${line.separator}</echo>
        <echo file="${output.dir}/myrepository-content.txt" append="true">${myrepository.content}</echo>
        <delete dir="${tutorial.build.dir}"/>
        <echo>NB! This tutorial fails deliberately!</echo>
        <run-tutorial antfile="${tutorial.src.dir}/build-a-ivy-repository/build.xml" target="maven2-deps" output="${output.dir}/install-deps.txt" failonerror="false"/>
        <pathconvert property="myrepository.content.deps" pathsep="${line.separator}">
            <fileset dir="${tutorial.src.dir}/build-a-ivy-repository/myrepository/no-namespace/org.hibernate/hibernate"/>
        </pathconvert>
        <echo file="${output.dir}/myrepository-content-deps.txt">[ivy@apache:/]$ find ${tutorial.src.dir}/build-a-ivy-repository/myrepository/no-namespace/org.hibernate/hibernate -type f -print${line.separator}</echo>
        <echo file="${output.dir}/myrepository-content-deps.txt" append="true">${myrepository.content.deps}</echo>
        <delete dir="${tutorial.build.dir}"/>

        <!--Building a repository - advanced.html -->
        <run-tutorial antfile="${tutorial.src.dir}/build-a-ivy-repository/build.xml" target="maven2-namespace" output="${output.dir}/install-namespace.txt"/>
        <pathconvert property="myrepository.content.namespace" pathsep="${line.separator}">
            <fileset dir="${tutorial.src.dir}/build-a-ivy-repository/myrepository/advanced"/>
        </pathconvert>
        <echo file="${output.dir}/myrepository-content-namespace.txt">$ find ${tutorial.src.dir}/build-a-ivy-repository/myrepository/advanced -type f -print${line.separator}</echo>
        <echo file="${output.dir}/myrepository-content-namespace.txt" append="true">${myrepository.content.namespace}</echo>
        <delete dir="${tutorial.build.dir}"/>

        <!-- multi-project - multiproject.html -->
        <run-tutorial antfile="${tutorial.src.dir}/multi-project/build.xml" target="-p" output="${output.dir}/multi-project-general-antp.txt"/>
        <run-tutorial antfile="${tutorial.src.dir}/multi-project/projects/find/build.xml" target="-p" output="${output.dir}/multi-project-find-antp.txt"/>
        <run-tutorial antfile="${tutorial.src.dir}/multi-project/build.xml" target="publish-all" output="${output.dir}/multi-project-general-publishall.txt"/>
        <delete dir="${tutorial.build.dir}"/>

        <!-- Correct the location of the examples to a dummy '/ivy' location -->
        <pathconvert property="tutorial.root" dirsep="/">
            <identitymapper/>
            <path location="${tutorial.src.dir}"/>
        </pathconvert>
        <pathconvert property="tutorial.local" dirsep="/">
            <identitymapper/>
            <path location="${tutorial.local-repo}"/>
        </pathconvert>
        <pathconvert property="ivy.jar.location" dirsep="/">
            <identitymapper/>
            <fileset file="${artifacts.build.dir}/jars/${final.name}"/>
        </pathconvert>

        <replace dir="${output.dir}" token="\" value="/"/>
        <replace dir="${output.dir}" token="${tutorial.root}" value="/ivy"/>
        <replace dir="${output.dir}" token="${tutorial.local}" value="/home/ivy/.ivy2/local"/>
        <replace dir="${output.dir}" token="${ivy.jar.location}" value="//home/ivy/ivy.jar"/>
        <replace dir="${output.dir}" token="-f build.xml " value=""/>
        <replace dir="${output.dir}" token="${ivy.revision}" value="working@apache"/>
    </target>

    <target name="init-asciidoctor-extensions" depends="init-ivy" unless="skip.doc">
        <ivy:cachepath pathid="asciidoctorj.path" organisation="org.asciidoctor" module="asciidoctorj" revision="1.5.7" conf="default" inline="true"/>
        <mkdir dir="${build.dir}/asciidoc-extensions/classes"/>
        <javac srcdir="${doc.src.dir}/templates/extensions/src" destdir="${build.dir}/asciidoc-extensions/classes"
               debug="true" includeantruntime="no" classpathref="asciidoctorj.path"/>
        <copy todir="${build.dir}/asciidoc-extensions">
            <fileset dir="${doc.src.dir}/templates/extensions/src">
                <exclude name="**/*.java"/>
            </fileset>
        </copy>
    </target>

    <target name="init-asciidoctor" depends="init-asciidoctor-extensions" unless="skip.doc">
        <mkdir dir="${build.dir}/asciidoc-lib/jars"/>
        <mkdir dir="${build.dir}/asciidoc-lib/classes"/>
        <ivy:retrieve organisation="org.asciidoctor" module="asciidoctor-ant" revision="1.5.5" conf="default" inline="true" pattern="${build.dir}/asciidoc-lib/jars/[artifact].[ext]"/>
        <unzip src="${build.dir}/asciidoc-lib/jars/asciidoctor-ant.jar" dest="${build.dir}/asciidoc-lib/classes"/>
        <taskdef uri="antlib:org.asciidoctor.ant" resource="org/asciidoctor/ant/antlib.xml">
            <classpath>
                <pathelement location="${build.dir}/asciidoc-extensions/classes"/>
                <pathelement location="${build.dir}/asciidoc-lib/classes"/>
            </classpath>
        </taskdef>
    </target>

    <target name="copy-doc-files" unless="skip.doc">
        <copy todir="${doc.build.dir}">
            <fileset dir="${doc.src.dir}" includes="images/**,style/**,samples/**,js/**,ivy.xsd"/>
            <fileset dir="${doc.src.dir}" includes="tutorial/log/multi-project-general-publishall.txt"/>
        </copy>
    </target>

    <target name="generate-doc" depends="generate-tutorial-output,default-version,init-asciidoctor,copy-doc-files" unless="skip.doc">
        <asciidoctor:convert sourceDirectory="${doc.src.dir}" outputDirectory="${doc.build.dir}" backend="xhtml5"
                             templateDir="${doc.src.dir}/templates" preserveDirectories="true"
                             sourceHighlighter="highlightjs">
            <attribute key="basedir" value="${doc.src.dir}"/>
            <attribute key="imagesdir" value=""/>
            <attribute key="version" value="${build.version}"/>
            <inlineMacroProcessor blockName="jira" className="org.apache.ivy.asciidoc.JiraMacro"/>
        </asciidoctor:convert>
    </target>

    <target name="generate-book-adoc" depends="default-version,copy-doc-files" unless="skip.doc">
        <scriptdef name="generate-book-adoc" language="javascript">
            <attribute name="jsontocfile"/>
            <attribute name="destFile"/>
            <![CDATA[
                var tocfile = self.getProject().resolveFile(attributes.get("jsontocfile"))
                r = new java.io.BufferedReader(new java.io.FileReader(tocfile));
                var val = "";
                while ((s = r.readLine()) != null) {
                    val += s;
                }
                r.close();
                var toc = eval("("+val+")")

                var writeToc = function(o, children, level) {
                    for (var c in children) {
                        o.write(level + ' link:#' + children[c].id.replace(/\//g, '_') + '[' + children[c].title + ']\n');
                        if (children[c].children && children[c].children.length && children[c].children.length != 0) {
                            writeToc(o, children[c].children, level+'*');
                        }
                    }
                };

                var writeInclude = function(o, children) {
                    for (var c in children) {
                        o.write('== [[' + children[c].id.replace(/\//g, '_') + ']]' + children[c].title + '\n\n');
                        o.write('include::../asciidoc/' + children[c].id + '.adoc[]\n\n');
                        if (children[c].children && children[c].children.length && children[c].children.length != 0) {
                            writeInclude(o, children[c].children);
                        }
                    }
                };

                out = new java.io.FileWriter(self.getProject().resolveFile(attributes.get("destfile")));
                out.write('== Table of Contents\n\n');
                writeToc(out, toc.children[0].children, '*');
                out.write('\n\n');
                writeInclude(out, toc.children[0].children, '*');
                out.close();
            ]]>
        </scriptdef>
        <mkdir dir="${build.dir}/book"/>
        <generate-book-adoc jsontocfile="${doc.src.dir}/toc.json" destFile="${build.dir}/book/book.adoc"/>
    </target>

    <target name="generate-book" depends="generate-book-adoc,init-asciidoctor">
        <asciidoctor:convert sourceDirectory="${build.dir}/book" outputDirectory="${doc.build.dir}" backend="xhtml5"
                             templateDir="${doc.src.dir}/templates/book" sourceHighlighter="highlightjs" doctype="book">
            <attribute key="version" value="${build.version}"/>
            <inlineMacroProcessor blockName="jira" className="org.apache.ivy.asciidoc.JiraMacro"/>
        </asciidoctor:convert>
    </target>

    <target name="all-doc" depends="javadoc,generate-doc,generate-book"/>

    <target name="init-snapshot" depends="default-version">
        <property name="snapshot.full.name" value="apache-ivy-${build.version}"/>
    </target>

    <target name="snapshot-metadata" depends="init-snapshot,resolve">
        <mkdir dir="${artifacts.build.dir}"/>
        <ivy:deliver
            deliverpattern="${artifacts.build.dir}/ivy.xml"
            pubrevision="${build.version}"
            pubdate="${pubdate}"
            status="${status}"/>
    </target>

    <target name="snapshot-src" depends="init-snapshot">
        <delete dir="${build.dir}/snapshot-src" failonerror="false"/>
        <exec executable="git" failonerror="true">
            <arg line="clone ${basedir} ${build.dir}/snapshot-src"/>
        </exec>
        <exec dir="${build.dir}/snapshot-src" executable="git" failonerror="true">
            <arg line="clean -d -x -f"/>
        </exec>
        <mkdir dir="${distrib.dir}/dist/${build.version}"/>
        <zip destfile="${distrib.dir}/dist/${build.version}/${snapshot.full.name}-src.zip" defaultexcludes="no">
            <zipfileset dir="${build.dir}/snapshot-src" prefix="${snapshot.full.name}" defaultexcludes="no" excludes=".git/**"/>
        </zip>
        <tar destfile="${distrib.dir}/dist/${build.version}/${snapshot.full.name}-src.tar.gz"
             compression="gzip" longfile="gnu" defaultexcludes="no">
            <zipfileset dir="${build.dir}/snapshot-src" prefix="${snapshot.full.name}" defaultexcludes="no" excludes=".git/**"/>
        </tar>
    </target>

    <target name="snapshot-bin-without-dependencies" depends="snapshot-metadata,jar,all-doc">
        <mkdir dir="${distrib.dir}/dist/${build.version}"/>
        <zip destfile="${distrib.dir}/dist/${build.version}/${snapshot.full.name}-bin.zip">
            <zipfileset dir="${doc.build.dir}" prefix="${snapshot.full.name}/doc" excludes="**/reports/coverage/**,**/reports/test/**"/>
            <zipfileset dir="${basedir}/src/example" prefix="${snapshot.full.name}/src/example"/>
            <zipfileset dir="${basedir}" includes="NOTICE" fullpath="${snapshot.full.name}/NOTICE"/>
            <zipfileset dir="${basedir}" includes="README" prefix="${snapshot.full.name}"/>
            <zipfileset dir="${basedir}" includes="LICENSE*" prefix="${snapshot.full.name}"/>
            <zipfileset dir="${basedir}" includes="CHANGES.txt" fullpath="${snapshot.full.name}/CHANGES.txt"/>
            <zipfileset dir="${basedir}" includes="RELEASE_NOTES" fullpath="${snapshot.full.name}/RELEASE_NOTES"/>
            <zipfileset dir="${src.dir}/org/apache/ivy/plugins/parser/xml" includes="ivy.xsd" fullpath="${snapshot.full.name}/ivy.xsd"/>
            <zipfileset dir="${artifacts.build.dir}" includes="ivy.xml" fullpath="${snapshot.full.name}/ivy.xml"/>
            <zipfileset dir="${basedir}" includes="build-for-bin-distrib.xml" fullpath="${snapshot.full.name}/build.xml"/>

            <zipfileset dir="${artifacts.build.dir}/jars" includes="${final.name}" fullpath="${snapshot.full.name}/ivy-${build.version}.jar"/>
        </zip>
        <tar destfile="${distrib.dir}/dist/${build.version}/${snapshot.full.name}-bin.tar.gz"
             compression="gzip" longfile="gnu">
            <zipfileset src="${distrib.dir}/dist/${build.version}/${snapshot.full.name}-bin.zip"/>
        </tar>
    </target>

    <target name="snapshot-bin-with-dependencies" depends="snapshot-metadata,jar,all-doc">
        <mkdir dir="${distrib.dir}/dist/${build.version}"/>
        <delete dir="${build.dir}/lib"/>
        <ivy:retrieve conf="default" pattern="${build.dir}/lib/[artifact]-[revision].[ext]"/>
        <zip destfile="${distrib.dir}/dist/${build.version}/${snapshot.full.name}-bin-with-deps.zip">
            <zipfileset dir="${doc.build.dir}" prefix="${snapshot.full.name}/doc" excludes="**/reports/coverage/**,**/reports/test/**"/>
            <zipfileset dir="${basedir}/src/example" prefix="${snapshot.full.name}/src/example"/>
            <zipfileset dir="${basedir}" includes="NOTICE" fullpath="${snapshot.full.name}/NOTICE"/>
            <zipfileset dir="${basedir}" includes="README" prefix="${snapshot.full.name}"/>
            <zipfileset dir="${basedir}" includes="LICENSE*" prefix="${snapshot.full.name}"/>
            <zipfileset dir="${basedir}" includes="CHANGES.txt" fullpath="${snapshot.full.name}/CHANGES.txt"/>
            <zipfileset dir="${basedir}" includes="RELEASE_NOTES" fullpath="${snapshot.full.name}/RELEASE_NOTES"/>
            <zipfileset dir="${src.dir}/org/apache/ivy/plugins/parser/xml" includes="ivy.xsd" fullpath="${snapshot.full.name}/ivy.xsd"/>
            <zipfileset dir="${artifacts.build.dir}" includes="ivy.xml" fullpath="${snapshot.full.name}/ivy.xml"/>

            <zipfileset dir="${artifacts.build.dir}/jars" includes="${final.name}" fullpath="${snapshot.full.name}/ivy-${build.version}.jar"/>

            <zipfileset dir="${build.dir}/lib" prefix="${snapshot.full.name}/lib" excludes="ant-*.jar,bcpg-*.jar,bcprov*.jar"/>
        </zip>
        <tar destfile="${distrib.dir}/dist/${build.version}/${snapshot.full.name}-bin-with-deps.tar.gz"
             compression="gzip" longfile="gnu">
            <zipfileset src="${distrib.dir}/dist/${build.version}/${snapshot.full.name}-bin-with-deps.zip"/>
        </tar>
    </target>

    <target name="snapshot-bin"
            depends="snapshot-bin-with-dependencies,snapshot-bin-without-dependencies"/>

    <target name="release-xsd" depends="init-snapshot">
        <!-- copies current ivy xml schema to doc source, so that it will be available from web site -->
        <copy file="${src.dir}/org/apache/ivy/plugins/parser/xml/ivy.xsd" todir="${doc.src.dir}"/>
    </target>

    <target name="snapshot-maven2" depends="init-snapshot,snapshot-metadata,jar,sources,javadoc">
        <property name="m2.distrib.dir" value="${distrib.dir}/maven2/${build.version}"/>
        <ivy:makepom ivyfile="${artifacts.build.dir}/ivy.xml"
                     pomfile="${m2.distrib.dir}/ivy-${build.version}.pom"
                     templatefile="${basedir}/src/etc/makepom/pom.template">
            <mapping conf="core" scope="compile"/>
            <mapping conf="test" scope="test"/>
        </ivy:makepom>
        <copy file="${artifacts.build.dir}/jars/${final.name}"
              tofile="${m2.distrib.dir}/ivy-${build.version}.jar"/>
        <!-- jar javadocs -->
        <jar destfile="${m2.distrib.dir}/ivy-${build.version}-javadoc.jar">
            <fileset dir="${javadoc.build.dir}"/>
        </jar>
        <!-- copy sources jar -->
        <copy file="${artifacts.build.dir}/sources/${final.name}"
              tofile="${m2.distrib.dir}/ivy-${build.version}-sources.jar"/>

        <checksum algorithm="sha1">
            <fileset dir="${m2.distrib.dir}">
                <include name="*.pom"/>
                <include name="*.jar"/>
            </fileset>
        </checksum>
        <checksum algorithm="sha-512" fileext=".sha512">
            <fileset dir="${m2.distrib.dir}">
                <include name="*.pom"/>
                <include name="*.jar"/>
            </fileset>
        </checksum>
    </target>

    <target name="snapshot-checksums">
        <checksum algorithm="sha1">
            <fileset dir="${distrib.dir}/dist/${build.version}">
                <include name="*.pom"/>
                <include name="*.jar"/>
                <include name="*.zip"/>
                <include name="*.gz"/>
            </fileset>
        </checksum>
        <checksum algorithm="sha-512" fileext=".sha512">
            <fileset dir="${distrib.dir}/dist/${build.version}">
                <include name="*.pom"/>
                <include name="*.jar"/>
                <include name="*.zip"/>
                <include name="*.gz"/>
            </fileset>
        </checksum>
    </target>

    <target name="snapshot-version">
        <property name="version.prefix" value="${target.ivy.version}-dev-"/>
    </target>

    <target name="release-version">
        <property name="build.version" value="${target.ivy.version}"/>
        <echo>Setting version to ${build.version}</echo>
        <condition property="status" value="release">
            <matches pattern="^\d+\.\d+\.\d+$" string="${build.version}"/>
        </condition>
        <condition property="status" value="milestone">
            <matches pattern="^\d+\.\d+\.\d+-(alpha|beta|rc)\d+$" string="${build.version}"/>
        </condition>
        <property name="status" value="integration"/>
        <echo>Setting status to ${status}</echo>
    </target>

    <target name="sign" depends="init-ivy">
        <property file="${user.home}/ivybuild.properties"/>
        <input message="please enter your PGP password: " addproperty="pgp.password"/>
        <input message="please enter your PGP keyId: " addproperty="pgp.keyId"/>

        <ivy:retrieve conf="default" pattern="${build.dir}/lib/[artifact]-[revision].[ext]"/>

        <taskdef resource="org/apache/ivy/ant/antlib.xml"
                 uri="antlib:org.apache.ivy.ant_2">
            <classpath>
                <fileset dir="${artifacts.build.dir}/jars" includes="${final.name}"/>
                <fileset dir="${build.dir}/lib" excludes="ant-*.jar"/>
            </classpath>
        </taskdef>

        <ivy2:settings id="sign.settingsId" file="ivysettings-release.xml"/>
        <ivy2:cachepath organisation="org.apache.commons" settingsRef="sign.settingsId" transitive="false" log="download-only"
                        module="commons-openpgp" revision="1.0-SNAPSHOT" inline="true" pathid="openpgp.classpath"/>
        <ivy2:cachepath organisation="org.bouncycastle" settingsRef="sign.settingsId" log="download-only"
                        module="bcprov-jdk16" revision="1.45" inline="true" pathid="bouncycastle.bcprov.classpath"/>
        <ivy2:cachepath organisation="org.bouncycastle" settingsRef="sign.settingsId" transitive="false" log="download-only"
                        module="bcpg-jdk16" revision="1.45" inline="true" pathid="bouncycastle.bcpg.classpath"/>

        <!--
            For some reason, if we use the openpgp:signer task here directly, the bouncycastle security
            provider cannot be loaded. If we launch it as a forked process everything works fine !?!
        -->
        <java classname="org.apache.tools.ant.launch.Launcher"
              fork="true">
            <classpath>
                <fileset dir="${ant.home}" includes="**/*.jar"/>
                <path refid="bouncycastle.bcprov.classpath"/>
                <path refid="bouncycastle.bcpg.classpath"/>
                <path refid="openpgp.classpath"/>
            </classpath>
            <arg line="-f build-release.xml"/>
            <arg line="sign-internal"/>
            <arg line="-Dpgp.password=${pgp.password}"/>
            <arg line="-Dpgp.keyId=${pgp.keyId}"/>
        </java>
    </target>

    <target name="sign-internal">
        <property file="build.properties"/>
        <taskdef resource="org/apache/commons/openpgp/ant/antlib.xml" uri="antlib:org.apache.commons.openpgp.ant"/>
        <openpgp:signer secring="${user.home}/.gnupg/secring.gpg"
                        pubring="${user.home}/.gnupg/pubring.gpg"
                        password="${pgp.password}"
                        keyid="${pgp.keyId}"
                        asciiarmor="true">
            <fileset dir="${distrib.dir}">
                <include name="**/*.pom"/>
                <include name="**/*.jar"/>
                <include name="**/*.zip"/>
                <include name="**/*.gz"/>
            </fileset>
        </openpgp:signer>
    </target>

    <target name="rat" depends="init-ivy">
        <property name="rat.failOnError" value="true"/>
        <ivy:cachepath organisation="org.apache.rat" module="apache-rat-tasks" revision="0.12"
                       inline="true" conf="default" pathid="rat.classpath"
                       log="download-only"/>

        <typedef resource="org/apache/rat/anttasks/antlib.xml"
                 uri="antlib:org.apache.rat.anttasks"
                 classpathref="rat.classpath"/>

        <delete dir="${rat.report.dir}"/>
        <mkdir dir="${rat.report.dir}"/>
        <rat:report xmlns:rat="antlib:org.apache.rat.anttasks" reportFile="${rat.report.dir}/rat-report.txt">
            <fileset dir="${basedir}">
                <exclude name=".classpath"/>
                <exclude name="ReleaseInstructions"/>
                <exclude name=".ivy2/**/*"/>
                <exclude name="build/**/*"/>
                <exclude name="bin/**/*"/>
                <exclude name="**/*.md5"/>
                <exclude name="**/*.sha1"/>
                <exclude name="**/*.sha512"/>
                <exclude name="**/*.txt"/>
                <exclude name="**/MANIFEST*.MF"/>
                <exclude name="**/*.json"/>
                <exclude name="**/*.SHA-256"/>
                <exclude name="**/*.SHA-512"/>
                <exclude name="asciidoc/js/jquery.pack.js"/>
                <exclude name="asciidoc/js/jquery.treeview.js"/>
            </fileset>
        </rat:report>

        <fail message="Some files have missing or incorrect license information. Check RAT report for more details: ${rat.report.dir}/rat-report.txt">
            <condition>
                <and>
                    <not><resourcecontains resource="${rat.report.dir}/rat-report.txt" substring="0 Unknown Licenses" casesensitive="false"/></not>
                    <equals arg1="${rat.failOnError}" arg2="true"/>
                </and>
            </condition>
        </fail>
    </target>

    <target name="upload-nexus" depends="release-version,init-ivy,jar">
        <ivy:retrieve conf="default" pattern="${build.dir}/lib/[artifact]-[revision].[ext]"/>

        <taskdef resource="org/apache/ivy/ant/antlib.xml"
                 uri="antlib:org.apache.ivy.ant_2">
            <classpath>
                <fileset dir="${artifacts.build.dir}/jars" includes="${final.name}"/>
                <fileset dir="${build.dir}/lib" excludes="ant-*.jar"/>
            </classpath>
        </taskdef>

        <property file="${user.home}/ivybuild.properties"/>
        <input message="please enter your PGP password: " addproperty="pgp.password"/>
        <input message="please enter your PGP keyId: " addproperty="pgp.keyId"/>

        <input message="please enter your repository.apache.org username: " addproperty="upload.user"/>
        <input message="please enter your repository.apache.org password: " addproperty="upload.password"/>

        <ivy2:settings id="upload.settingsId" file="ivysettings-release.xml"/>
        <ivy2:resolve file="${basedir}/build/artifact/ivy.xml" transitive="false"/>
        <ivy2:publish organisation="org.apache.ivy"
                      module="ivy"
                      revision="${build.version}"
                      srcivypattern="${basedir}/build/artifact/ivy.xml"
                      artifactspattern="${basedir}/build/distrib/maven2/[revision]/[artifact]-[revision](-[classifier]).[ext]"
                      publishivy="false"
                      conf="core"
                      settingsRef="upload.settingsId"
                      resolver="nexus">
            <!-- The standard maven2 artifacts -->
            <artifact name="ivy" ext="pom" type="ivy"/>
            <artifact name="ivy" ext="jar" type="sources" classifier="sources"/>
            <artifact name="ivy" ext="jar" type="javadoc" classifier="javadoc"/>
        </ivy2:publish>
    </target>

    <target name="prepare-snapshot"
            depends="/localivy,clean-ivy-home,clean,clean-lib,snapshot-version,install,clean-examples,test-report"/>

    <target name="snapshot"
            depends="prepare-snapshot,snapshot-src,snapshot-bin,snapshot-maven2,snapshot-checksums"
            description="used for nightly and integration builds"/>

    <target name="release"
            depends="release-version,/localivy,clean-ivy-home,clean,clean-lib,rat,snapshot"
            description="make a new release of Ivy"/>

    <target name="tagsdoc" depends="generate-doc"
            description="generate tagsdoc.properties file which can be used in IvyDE for code completion documentation">
        <scriptdef name="generate-tagsdoc" language="javascript">
            <element name="fileset" type="fileset"/>
            <attribute name="destFile"/>
            <![CDATA[
                fs = elements.get("fileset").get(0);
                srcDir = fs.getDir(project);

                // Get the files (array) of that fileset
                srcFiles = fs.getDirectoryScanner(project).getIncludedFiles();

                // iterate over that array
                print('processing ' + srcFiles.length + ' source files...');

                var xpath = javax.xml.xpath.XPathFactory.newInstance().newXPath();
                out = new java.io.FileWriter(self.getProject().resolveFile(attributes.get("destfile")));
                for (i = 0; i < srcFiles.length; i++) {
                    try {
                        // get the values via Java API
                        var file = new java.io.File(srcDir, srcFiles[i]);
                        print('processing ' + file + '...');

                        inputSource = new org.xml.sax.InputSource(new java.io.FileInputStream(file));

                        dbf = javax.xml.parsers.DocumentBuilderFactory.newInstance();
                        dbf.setValidating(false);
                        dbf.setIgnoringComments(false);
                        dbf.setIgnoringElementContentWhitespace(true);
                        dbf.setNamespaceAware(false);
                        dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false);
                        dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
                        builder = dbf.newDocumentBuilder();
                        document = builder.parse(inputSource);

                        var expression = "//span[contains(@class, 'ivysettings.')]";
                        var t = xpath.evaluate(expression, document, javax.xml.xpath.XPathConstants.NODE);
                        if (t == null) {
                            print('\tno tagdoc span found: ignored');
                            continue;
                        }
                        var id = t.getAttributes().getNamedItem("class").getTextContent();

                        out.write('##### ' + id + '\n');
                        out.write(id + ' = ' + t.getTextContent() + '\n');

                        text = (id === "ivysettings.resolvers") ? "Name" : "Attribute"
                        expression = "(//table/thead/tr/th[text()='" + text + "'])[1]/../../../tbody/tr/td[1]";
                        var atts = xpath.evaluate(expression, document, javax.xml.xpath.XPathConstants.NODESET);
                        for (j = 0; j < atts.getLength(); j++) {
                            name = atts.item(j).getTextContent().split(/[\s,]+/).pop()
                            out.write(id + '.@' + ((id === "ivysettings.resolvers") ? name.toLowerCase() : name) + ' = '
                                + xpath.evaluate("../td[2]", atts.item(j), javax.xml.xpath.XPathConstants.NODE)
                                    .getTextContent().replace(/\n/g, " ").replace(/[\x00-\x1F\xA0-\xE1\xE3-\xFF]/g, "") + '\n');
                        }
                    } catch (e) {
                        print('\terror: ' + e);
                    }
                }
                out.close();
            ]]>
        </scriptdef>
        <generate-tagsdoc destFile="tagsdoc.properties">
            <fileset dir="${doc.build.dir}" includes="settings/**/*.html,resolver/**/*.html"/>
        </generate-tagsdoc>
    </target>

</project>
