<?xml version="1.0"?>

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

<project name="lucene-solr" default="-projecthelp" basedir=".">
  <import file="lucene/common-build.xml"/>

  <property name="jgit-version" value="4.2.0.201601211800-r"/>
  
  <property name="tests.heap-dump-dir" location="heapdumps"/>
  
  <property name="maven-build-dir" value="maven-build"/>
  <property name="maven-version" value="2.2.1"/>
  <property name="maven.dependencies.filters.file" location="lucene/build/maven.dependencies.filters.properties"/>

  <property name="smokeTestRelease.dir" location="lucene/build/smokeTestRelease/dist"/>
  <property name="smokeTestRelease.tmp" location="lucene/build/smokeTestRelease/tmp"/>
  <property name="smokeTestRelease.testArgs" value=""/>

  <target name="-projecthelp">
    <java fork="false" classname="org.apache.tools.ant.Main" taskname="-">
      <arg value="-projecthelp"/>
      <arg value="-f"/>
      <arg value="${ant.file}"/>
    </java>
  </target>

  <target name="test-help" description="Test runner help">
    <subant buildpath="lucene" target="test-help" inheritall="false" failonerror="true"/>
  </target>

  <target name="precommit" description="Run basic checks before committing"
          depends="check-working-copy,validate,documentation-lint"/>

  <target name="test" description="Test both Lucene and Solr" depends="resolve-groovy">
    <mkdir dir="lucene/build" />
    <tempfile property="tests.totals.tmpfile"
          destdir="lucene/build"
          prefix=".test-totals-"
          suffix=".tmp"
          deleteonexit="true"
          createfile="true" />

    <subant target="test" inheritall="false" failonerror="true">
      <fileset dir="lucene" includes="build.xml" />
      <fileset dir="solr" includes="build.xml" />
      <propertyset>
        <propertyset refid="uptodate.and.compiled.properties"/>
        <propertyref name="tests.totals.tmpfile" />
      </propertyset>      
    </subant>

    <property name="tests.totals.toplevel" value="true" />
    <antcall target="-check-totals" />
  </target>

  <target name="jacoco" depends="resolve-groovy" description="Generates JaCoCo code coverage reports">
    <subant target="jacoco" inheritall="false" failonerror="true">
      <fileset dir="lucene" includes="build.xml" />
      <fileset dir="solr" includes="build.xml" />
      <propertyset refid="uptodate.and.compiled.properties"/>
    </subant>
  </target>

  <target name="pitest" depends="resolve-groovy" description="Run PITest on both Lucene and Solr">
    <subant target="pitest" inheritall="false" failonerror="true">
      <fileset dir="lucene" includes="build.xml" />
      <fileset dir="solr" includes="build.xml" />
      <propertyset refid="uptodate.and.compiled.properties"/>
    </subant>
  </target>

  <target name="beast">
    <fail message="The Beast only works inside of individual modules"/>
  </target>

  <target name="documentation" depends="resolve-pegdown" description="Generate Lucene and Solr Documentation">
    <subant target="documentation" inheritall="false" failonerror="true">
      <fileset dir="lucene" includes="build.xml" />
      <fileset dir="solr" includes="build.xml" />
      <propertyset refid="uptodate.and.compiled.properties"/>
    </subant>
  </target>

  <target name="documentation-lint" depends="resolve-pegdown,-ecj-javadoc-lint-unsupported,-ecj-resolve" description="Validates the generated documentation (HTML errors, broken links,...)">
    <subant target="documentation-lint" inheritall="false" failonerror="true">
      <fileset dir="lucene" includes="build.xml" />
      <fileset dir="solr" includes="build.xml" />
      <propertyset refid="uptodate.and.compiled.properties"/>
    </subant>
  </target>

  <target name="check-forbidden-apis" depends="-install-forbidden-apis" description="Check forbidden API calls in compiled class files.">
    <subant target="check-forbidden-apis" inheritall="false" failonerror="true">
      <fileset dir="lucene" includes="build.xml" />
      <fileset dir="solr" includes="build.xml" />
      <propertyset refid="uptodate.and.compiled.properties"/>
    </subant>
  </target>

  <target name="validate" description="Validate dependencies, licenses, etc." depends="-validate-source-patterns,resolve-groovy,rat-sources-typedef,-install-forbidden-apis">
    <subant target="validate" inheritall="false" failonerror="true">
      <fileset dir="lucene" includes="build.xml" />
      <fileset dir="solr" includes="build.xml" />
      <propertyset refid="uptodate.and.compiled.properties"/>
    </subant>
    <subant buildpath="lucene" target="check-lib-versions" inheritall="false" failonerror="true">
      <propertyset refid="uptodate.and.compiled.properties"/>
    </subant>
  </target>
  
  <target name="-validate-source-patterns" unless="disable.source-patterns" depends="resolve-groovy,rat-sources-typedef">
    <!-- check that there are no @author javadoc tags, tabs, svn keywords, javadoc-style licenses, or nocommits: -->
    <property name="validate.baseDir" location="."/>
    <groovy taskname="source-patterns" classpathref="rat.classpath"><![CDATA[
      import org.apache.tools.ant.BuildException;
      import org.apache.tools.ant.Project;
      import org.apache.rat.Defaults;
      import org.apache.rat.document.impl.FileDocument;
      import org.apache.rat.api.MetaData;
      
      def extensions = [
        'java', 'jflex', 'py', 'pl', 'g4', 'jj', 'html', 'js',
        'css', 'xml', 'xsl', 'vm', 'sh', 'cmd', 'bat', 'policy',
        'properties', 'mdtext',
      ];
      def invalidPatterns = [
        (~$/@author\b/$) : '@author javadoc tag',
        (~$/(?i)\bno(n|)commit\b/$) : 'nocommit',
        (~$/\bTOOD:/$) : 'TOOD instead TODO',
        (~$/\t/$) : 'tabs instead spaces',
        (~$/\$$(?:LastChanged)?Date\b/$) : 'svn keyword',
        (~$/\$$(?:(?:LastChanged)?Revision|Rev)\b/$) : 'svn keyword',
        (~$/\$$(?:LastChangedBy|Author)\b/$) : 'svn keyword',
        (~$/\$$(?:Head)?URL\b/$) : 'svn keyword',
        (~$/\$$Id\b/$) : 'svn keyword',
        (~$/\$$Header\b/$) : 'svn keyword',
        (~$/\$$Source\b/$) : 'svn keyword',
      ];
      
      def baseDir = properties['validate.baseDir'];
      def baseDirLen = baseDir.length() + 1;
      
      def found = 0;
      def violations = new TreeSet();
      def reportViolation = { f, name ->
        task.log(name + ': ' + f.toString().substring(baseDirLen).replace(File.separatorChar, (char)'/'), Project.MSG_ERR);
        violations.add(name);
        found++;
      }
      
      def javadocsPattern = ~$/(?sm)^\Q/**\E(.*?)\Q*/\E/$;
      def lineSplitter = ~$/[\r\n]+/$;
      def licenseMatcher = Defaults.createDefaultMatcher();
      def validLoggerPattern = ~$/(?s)\b(private\s|static\s|final\s){3}+\s*Logger\s+\p{javaJavaIdentifierStart}+\s+=\s+\QLoggerFactory.getLogger(MethodHandles.lookup().lookupClass());\E/$;
      
      ant.fileScanner{
        fileset(dir: baseDir){
          extensions.each{
            include(name: 'lucene/**/*.' + it)
            include(name: 'solr/**/*.' + it)
            include(name: 'dev-tools/**/*.' + it)
            include(name: '*.' + it)
          }
          // TODO: For now we don't scan txt files, so we
          // check licenses in top-level folders separately:
          include(name: '*.txt')
          include(name: '*/*.txt')
          // excludes:
          exclude(name: '**/build/**')
          exclude(name: '**/dist/**')
          exclude(name: '**/CheckLoggingConfiguration.java')
          exclude(name: 'build.xml') // ourselves :-)
        }
      }.each{ f ->
        task.log('Scanning file: ' + f, Project.MSG_VERBOSE);
        def text = f.getText('UTF-8');
        invalidPatterns.each{ pattern,name ->
          if (pattern.matcher(text).find()) {
            reportViolation(f, name);
          }
        }
        def javadocsMatcher = javadocsPattern.matcher(text);
        while (javadocsMatcher.find()) {
          def ratDocument = new FileDocument(f);
          licenseMatcher.reset();
          if (lineSplitter.split(javadocsMatcher.group(1)).any{ licenseMatcher.match(ratDocument, it) }) {
            reportViolation(f, String.format(Locale.ENGLISH, 'javadoc-style license header [%s]',
              ratDocument.getMetaData().value(MetaData.RAT_URL_LICENSE_FAMILY_NAME)));
          }
        }
        if (f.toString().endsWith('.java') && text.contains('org.slf4j.LoggerFactory')) {
          if (!validLoggerPattern.matcher(text).find()) {
            reportViolation(f, 'invalid logging pattern [not private static final, uses static class name]');
          }
        }
      };
      
      if (found) {
        throw new BuildException(String.format(Locale.ENGLISH, 'Found %d violations in source files (%s).',
          found, violations.join(', ')));
      }
    ]]></groovy>
  </target>
  
  <target name="rat-sources" description="Runs rat across all sources and tests" depends="common.rat-sources">
    <subant target="rat-sources" inheritall="false" failonerror="true">
      <fileset dir="lucene" includes="build.xml" />
      <fileset dir="solr" includes="build.xml" />
      <propertyset refid="uptodate.and.compiled.properties"/>
    </subant>
  </target>

  <target name="resolve" description="Resolves all dependencies">
    <subant target="resolve" inheritall="false" failonerror="true">
      <fileset dir="lucene" includes="build.xml" />
      <fileset dir="solr" includes="build.xml" />
      <propertyset refid="uptodate.and.compiled.properties"/>
    </subant>
  </target>

  <!-- lucene/test-framework and solr/test-framework are excluded from compilation -->
  <target name="compile" description="Compile Lucene and Solr">
    <subant target="compile" inheritall="false" failonerror="true">
      <fileset dir="lucene" includes="build.xml" />
      <fileset dir="solr" includes="build.xml" />
      <propertyset refid="uptodate.and.compiled.properties"/>
    </subant>
  </target>

  <target name="compile-core" description="Compile Lucene Core">
    <subant target="compile-core" inheritall="false" failonerror="true">
      <fileset dir="lucene" includes="build.xml" />
      <propertyset refid="uptodate.and.compiled.properties"/>
    </subant>
  </target>

  <target name="compile-test" description="Compile Lucene and Solr tests and test-frameworks">
    <subant target="compile-test" inheritAll="false" failonerror="true">
      <fileset dir="lucene" includes="build.xml" />
      <fileset dir="solr" includes="build.xml" />
      <propertyset refid="uptodate.and.compiled.properties"/>
    </subant>
  </target>

  <target name="jar" description="Build Lucene and Solr Jar files">
    <subant target="jar" inheritall="false" failonerror="true">
      <fileset dir="lucene" includes="build.xml"/>
      <fileset dir="solr" includes="build.xml"/>
      <propertyset refid="uptodate.and.compiled.properties"/>
    </subant>
  </target>

  <target name="jar-src" description="Build Lucene and Solr Source Jar files">
    <subant target="jar-src" inheritall="false" failonerror="true">
      <fileset dir="lucene" includes="build.xml"/>
      <fileset dir="solr" includes="build.xml"/>
      <propertyset refid="uptodate.and.compiled.properties"/>
    </subant>
  </target>

  <target name="get-maven-poms" depends="resolve" 
          description="Copy Maven POMs from dev-tools/maven/ to maven-build/">
    <ant dir="lucene" target="-get-maven-poms" inheritall="false"/>
  </target>

  <target name="clean-maven-build"
          description="Clean up Maven POMs in working copy">
    <delete failonerror="true" dir="${maven-build-dir}/"/>
  </target>

  <target name="generate-maven-artifacts" depends="resolve,resolve-groovy,resolve-pegdown,install-maven-tasks"
          description="Generate Maven Artifacts for Lucene and Solr">
    <property name="maven.dist.dir"  location="dist/maven" />
    <mkdir dir="${maven.dist.dir}" />
    <ant dir="lucene" inheritall="false">
      <target name="-unpack-lucene-tgz"/>
      <target name="-filter-pom-templates"/>
      <propertyset refid="uptodate.and.compiled.properties"/>
    </ant>
    <ant dir="solr" target="-unpack-solr-tgz" inheritall="false">
      <propertyset refid="uptodate.and.compiled.properties"/>
    </ant>
    <subant target="-dist-maven" inheritall="false" failonerror="true">
      <property name="maven.dist.dir"  location="${maven.dist.dir}" />
      <fileset dir="lucene" includes="build.xml" />
      <fileset dir="solr" includes="build.xml" />
      <propertyset refid="uptodate.and.compiled.properties"/>
    </subant>
  </target>

  <target name="validate-maven-dependencies" depends="generate-maven-artifacts"
          description="Validates maven dependencies, licenses, etc.">
    <subant target="-validate-maven-dependencies" inheritall="false" failonerror="true">
      <fileset dir="lucene" includes="build.xml"/>
      <fileset dir="solr" includes="build.xml"/>
      <propertyset refid="uptodate.and.compiled.properties"/>
    </subant>
  </target>
  
  <target name="run-maven-build" depends="get-maven-poms,install-maven-tasks,resolve-groovy" description="Runs the Maven build using automatically generated POMs">
    <groovy><![CDATA[
      import groovy.xml.NamespaceBuilder;
      import org.apache.tools.ant.Project;
      def userHome = properties['user.home'], commonDir = properties['common.dir'];
      def propPrefix = '-mvn.inject.'; int propPrefixLen = propPrefix.length();
      def subProject = project.createSubProject();
      project.copyUserProperties(subProject);
      subProject.initProperties();
      new AntBuilder(subProject).sequential{
        property(file: userHome+'/lucene.build.properties', prefix: propPrefix);
        property(file: userHome+'/build.properties', prefix: propPrefix);
        property(file: commonDir+'/build.properties', prefix: propPrefix);
      };
      def cmdlineProps = subProject.properties
        .findAll{ k, v -> k.startsWith(propPrefix) }
        .collectEntries{ k, v -> [k.substring(propPrefixLen), v] };
      cmdlineProps << project.userProperties.findAll{ k, v -> !k.startsWith('ant.') };
      def artifact = NamespaceBuilder.newInstance(ant, 'antlib:org.apache.maven.artifact.ant');
      task.log('Running Maven with props: ' + cmdlineProps.toString(), Project.MSG_INFO);
      artifact.mvn(pom: properties['maven-build-dir']+'/pom.xml', mavenVersion: properties['maven-version'], failonerror: true, fork: true) {
        cmdlineProps.each{ k, v -> arg(value: '-D' + k + '=' + v) };
        arg(value: '-fae');
        arg(value: 'install');
      };
    ]]></groovy>
  </target>
  
  <target name="remove-maven-artifacts" description="Removes all Lucene/Solr Maven artifacts from the local repository">
    <echo message="Removing all Lucene/Solr Maven artifacts from '${user.home}/.m2/repository'..."/>
    <delete includeemptydirs="true">
      <fileset dir="${user.home}/.m2/repository" erroronmissingdir="false">
        <include name="org/apache/lucene/**"/>
        <include name="org/apache/solr/**"/>
      </fileset>
    </delete>
  </target>

  <target name="netbeans" depends="resolve" description="Setup Netbeans configuration">
    <pathconvert property="netbeans.fileset.sourcefolders" pathsep="|" dirsep="/">
      <dirset dir="${basedir}/lucene" includes="**/src/java, **/src/examples, **/src/test, **/src/resources" 
              excludes="tools/**, build/**" />
      <dirset dir="${basedir}/solr" includes="**/src/java, **/src/examples, **/src/test, **/src/resources" 
              excludes="build/**" />
      <map from="${basedir}/" to=""/>
    </pathconvert>
    <!-- TODO: find a better way to exclude duplicate JAR files & fix the servlet-api mess! -->
    <pathconvert property="netbeans.path.libs" pathsep=":" dirsep="/">
      <fileset dir="${basedir}/lucene" includes="**/lib/*.jar" 
               excludes="**/*servlet-api*.jar, analysis/uima/**, tools/**, build/**"/>
      <fileset dir="${basedir}/solr" includes="**/test-lib/*.jar,**/lib/*.jar" 
               excludes="core/test-lib/*servlet-api*.jar, contrib/analysis-extras/**, test-framework/lib/junit*, test-framework/lib/ant*, test-framework/lib/randomizedtesting*, build/**, dist/**, package/**, server/solr-webapp/**" />
      <map from="${basedir}/" to=""/>
    </pathconvert>
    <mkdir dir="nbproject"/>
    <copy todir="nbproject" overwrite="true">
      <fileset dir="dev-tools/netbeans/nbproject"/>
    </copy>
    <xslt in="${ant.file}" out="nbproject/project.xml" style="dev-tools/netbeans/nb-project.xsl" force="true">
      <outputproperty name="indent" value="yes"/>
      <param name="netbeans.fileset.sourcefolders" expression="${netbeans.fileset.sourcefolders}"/>
      <param name="netbeans.path.libs" expression="${netbeans.path.libs}"/>
      <param name="netbeans.source-level" expression="1.7"/>
    </xslt>
  </target>

  <target name="clean-netbeans" description="Removes all Netbeans configuration files">
    <delete dir="nbproject" failonerror="true"/>
    <delete dir="nb-build" failonerror="true"/>
  </target>

  <target name="eclipse" depends="resolve" description="Setup Eclipse configuration">
    <basename file="${basedir}" property="eclipseprojectname"/>
      <copy file="dev-tools/eclipse/dot.project" tofile=".project" overwrite="false" encoding="UTF-8">
      <filterset>
        <filter token="ECLIPSEPROJECTNAME" value="${eclipseprojectname}"/>
      </filterset>
    </copy>
    <mkdir dir=".settings"/>
    <copy todir=".settings/" overwrite="true">
      <fileset dir="dev-tools/eclipse/dot.settings" includes="*.prefs" />
    </copy>
    
    <pathconvert property="eclipse.fileset.sourcefolders" pathsep="|" dirsep="/">
      <dirset dir="${basedir}/lucene" includes="**/src/java, **/src/resources, **/src/test, **/src/test-files, **/src/examples" excludes="tools/**, build/**" />
      <dirset dir="${basedir}/solr" includes="**/src/java, **/src/resources, **/src/test, **/src/test-files, **/src/examples" excludes="build/**" />
      <map from="${basedir}/" to=""/>
    </pathconvert>
    <!-- TODO: find a better way to exclude duplicate JAR files & fix the servlet-api mess! -->
    <pathconvert property="eclipse.fileset.libs" pathsep="|" dirsep="/">
      <fileset dir="${basedir}/lucene" includes="**/lib/*.jar" excludes="**/*servlet-api*.jar, analysis/uima/**, tools/**, build/**"/>
      <fileset dir="${basedir}/solr" includes="**/test-lib/*.jar,**/lib/*.jar" excludes="core/test-lib/*servlet-api*.jar, contrib/analysis-extras/**, test-framework/lib/junit*, test-framework/lib/ant*, test-framework/lib/randomizedtesting*, build/**, dist/**, package/**" />
      <map from="${basedir}/" to=""/>
    </pathconvert>
    <xslt in="${ant.file}" out=".classpath" style="dev-tools/eclipse/dot.classpath.xsl" force="true">
      <outputproperty name="indent" value="yes"/>
      <param name="eclipse.fileset.libs" expression="${eclipse.fileset.libs}"/>
      <param name="eclipse.fileset.sourcefolders" expression="${eclipse.fileset.sourcefolders}"/>
    </xslt>

    <echo>
      SUCCESS: You must right-click your project and choose Refresh.
               Your project must use a Java 7 JRE.
    </echo>
  </target>

  <target name="clean-eclipse" description="Removes all Eclipse configuration files">
    <delete dir=".settings" failonerror="true"/>
    <delete failonerror="true">
      <fileset dir="." includes=".classpath,.project"/>
    </delete>
    <delete dir="eclipse-build" failonerror="true"/>
  </target>

  <target name="idea" depends="resolve" description="Setup IntelliJ IDEA configuration">
    <condition property="idea.jdk.is.set">
      <isset property="idea.jdk"/>
    </condition>
    <!-- Define ${idea.jdk} if it's not yet defined - otherwise literal "${idea.jdk}" is substituted -->
    <property name="idea.jdk" value=""/>
    <!-- delete those files first, so they are regenerated by the filtering below
      (add more files with dynamic properties like versions here): -->
    <delete dir=".idea" includes="misc.xml workspace.xml"/>
    <!-- Copy files with filtering: -->
    <copy todir="." overwrite="false" encoding="UTF-8">
      <fileset dir="dev-tools/idea"/>
      <filterset begintoken="subst.=&quot;" endtoken="&quot;">
        <filter token="idea.jdk" value="${idea.jdk}"/>
      </filterset>
      <filterset>
        <filter token="version" value="${version}"/>
        <filter token="version.base" value="${version.base}"/>
      </filterset>
    </copy>
    <antcall target="-post-idea-instructions"/>
  </target>
  
  <target name="-post-idea-instructions" unless="idea.jdk.is.set">
    <echo>
To complete IntelliJ IDEA setup, you must manually configure
File | Project Structure | Project | Project SDK.
      
You won't have to do this in the future if you define property
$${idea.jdk}, e.g. in ~/lucene.build.properties, ~/build.properties
or lucene/build.properties, with a value consisting of the
following two XML attributes/values (adjust values according to
JDKs you have defined locally - see 
File | Project Structure | Platform Settings | SDKs):

    idea.jdk = project-jdk-name="1.7" project-jdk-type="JavaSDK"
    </echo>
  </target>

  <target name="clean-idea"
          description="Removes all IntelliJ IDEA configuration files">
    <delete dir=".idea" failonerror="true"/>
    <delete failonerror="true">
      <fileset dir="." includes="*.iml,*.ipr,*.iws"/>
      <fileset dir="solr" includes="**/*.iml"/>
      <fileset dir="lucene" includes="**/*.iml"/>
    </delete>
    <delete dir="idea-build" failonerror="true"/>
  </target>

  <target name="clean" description="Clean Lucene and Solr build dirs">
    <delete dir="dist" />
    <delete dir="${tests.heap-dump-dir}" />
    <subant target="clean" inheritall="false" failonerror="true">
      <fileset dir="lucene" includes="build.xml" />
      <fileset dir="solr" includes="build.xml" />
      <propertyset refid="uptodate.and.compiled.properties"/>
    </subant>
  </target>

  <target name="clean-jars" description="Remove all JAR files from lib folders in the checkout">
    <delete failonerror="true">
      <fileset dir=".">
        <include name="**/*.jar"/>
        <exclude name="*/build/**"/>
        <exclude name="*/dist/**"/>
        <exclude name="*/package/**"/>
        <exclude name="*/example/exampledocs/**"/>
      </fileset>
    </delete>
  </target>

  <target name="jar-checksums" description="Recompute SHA1 checksums for all JAR files.">
    <subant target="jar-checksums" inheritall="false" failonerror="true">
      <fileset dir="lucene" includes="build.xml" />
      <fileset dir="solr" includes="build.xml" />
      <propertyset refid="uptodate.and.compiled.properties"/>
    </subant>
  </target>
  
  <target name="-nightly-smoke-java8params" if="smokeTestRelease.java8">
    <!-- convert path to UNIX style, so windows backslashes don't hurt escaping: -->
    <pathconvert targetos="unix" property="-smokeTestRelease.java8params">
      <regexpmapper from="^(.*)$" to="--test-java8 '\1'"/>
      <path location="${smokeTestRelease.java8}"/>
    </pathconvert>
  </target>

  <target name="nightly-smoke" description="Builds an unsigned release and smoke tests it (pass '-DsmokeTestRelease.java8=/path/to/jdk1.8.0' to additionally test with Java 8)"
    depends="clean,resolve-groovy,resolve-pegdown,install-maven-tasks,-nightly-smoke-java8params">
    <fail message="To run nightly smoke, the JDK must be exactly Java 1.7, was: ${java.specification.version}">
      <condition>
        <not><equals arg1="${java.specification.version}" arg2="1.7"/></not>
      </condition>
    </fail>
    <property name="-smokeTestRelease.java8params" value=""/><!-- (if not yet defined) -->
    <exec executable="${python32.exe}" failonerror="true" taskname="python32">
      <arg value="-V"/>
    </exec>
    <subant target="prepare-release-no-sign" inheritall="false" failonerror="true">
      <fileset dir="lucene" includes="build.xml" />
      <fileset dir="solr" includes="build.xml" />
      <!-- pass ${version.base} here to emulate a real release, without appendix like "-SNAPSHOT": -->
      <property name="version" value="${version.base}" />
      <propertyset refid="uptodate.and.compiled.properties"/>
   </subant>
    <mkdir dir="${smokeTestRelease.dir}"/>
    <copy todir="${smokeTestRelease.dir}/lucene">
      <fileset dir="lucene/dist"/>
    </copy>
    <copy todir="${smokeTestRelease.dir}/solr">
      <fileset dir="solr/package"/>
    </copy>
    <local name="url"/>
    <makeurl file="${smokeTestRelease.dir}" validate="false" property="url"/>
    <exec executable="${python32.exe}" failonerror="true" taskname="smoker">
      <arg value="-u"/>
      <!-- Tell Python not to write any bytecode cache into the filesystem: -->
      <arg value="-B"/>
      <arg file="dev-tools/scripts/smokeTestRelease.py"/>
      <arg line="${-smokeTestRelease.java8params}"/>
      <arg value="--revision"/>
      <arg value="skip"/>
      <!-- pass ${version.base} here to emulate a real release, without appendix like "-SNAPSHOT": -->
      <arg value="--version"/>
      <arg value="${version.base}"/>
      <arg value="--tmp-dir"/>
      <arg file="${smokeTestRelease.tmp}"/>
      <arg value="--not-signed"/>
      <arg value="${url}"/>
      <arg value="${smokeTestRelease.testArgs}"/>
    </exec>
    <delete dir="${smokeTestRelease.dir}"/>
    <delete dir="${smokeTestRelease.tmp}"/>
  </target>
  
  <macrodef xmlns:ivy="antlib:org.apache.ivy.ant" name="wc-checker">
    <attribute name="failonmodifications"/><!-- fail if modifications were found, otherwise it only fails on unversioned files -->
    <sequential>
      <local name="wc.unversioned.files"/>
      <local name="wc.modified.files"/>
      <ivy:cachepath xmlns:ivy="antlib:org.apache.ivy.ant"
        organisation="org.eclipse.jgit" module="org.eclipse.jgit" revision="${jgit-version}"
        inline="true" conf="default" transitive="true" pathid="jgit.classpath"/>
      <groovy taskname="wc-checker" classpathref="jgit.classpath"><![CDATA[
        import org.apache.tools.ant.BuildException;
        import org.apache.tools.ant.Project;
        import org.eclipse.jgit.api.Git;
        import org.eclipse.jgit.api.Status;
        import org.eclipse.jgit.lib.Repository;
        import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
        import org.eclipse.jgit.errors.*;

        def setProjectPropertyFromSet(prop, set) {
          if (set) {
            properties[prop] = '* ' + set.join(properties['line.separator'] + '* ');
          }
        };

        try {
          task.log('Initializing working copy...', Project.MSG_INFO);
          final Repository repository = new FileRepositoryBuilder()
            .setWorkTree(project.getBaseDir())
            .setMustExist(true)
            .build();

          task.log('Checking working copy status...', Project.MSG_INFO);
          final Status status = new Git(repository).status().call();
          if (!status.isClean()) {
            final SortedSet unversioned = new TreeSet(), modified = new TreeSet();
            status.properties.each{ prop, val ->
              if (val instanceof Set) {
                if (prop in ['untracked', 'untrackedFolders', 'missing']) {
                  unversioned.addAll(val);
                } else if (prop != 'ignoredNotInIndex') {
                  modified.addAll(val);
                }
              }
            };
            setProjectPropertyFromSet('wc.unversioned.files', unversioned);
            setProjectPropertyFromSet('wc.modified.files', modified);
          }
        } catch (RepositoryNotFoundException | NoWorkTreeException | NotSupportedException e) {
          task.log('WARNING: Development directory is not a valid GIT checkout! Disabling checks...', Project.MSG_WARN);
        }
      ]]></groovy>
      <fail if="wc.unversioned.files"
        message="Source checkout is dirty (unversioned/missing files) after running tests!!! Offending files:${line.separator}${wc.unversioned.files}"/>
      <fail message="Source checkout is modified!!! Offending files:${line.separator}${wc.modified.files}">
        <condition>
          <and>
             <istrue value="@{failonmodifications}"/>
             <isset property="wc.modified.files"/>
          </and>
        </condition>
      </fail>
    </sequential>
  </macrodef>
  
  <target name="check-working-copy" description="Checks working copy for unversioned changes" depends="resolve-groovy">
    <wc-checker failonmodifications="${is.jenkins.build}"/>
  </target>

  <target name="run-clover" description="Runs all tests to measure coverage and generates report (pass &quot;ANT_OPTS=-Xmx1536M&quot; as environment)" depends="clean">
    <antcall inheritAll="false">
      <param name="run.clover" value="true"/>
      <!-- must be 1, as clover does not like parallel test runs: -->
      <param name="tests.jvms.override" value="1"/>
      <!-- Also override some other props to be fast: -->
      <param name="tests.multiplier" value="1"/>
      <param name="tests.nightly" value="false"/>
      <param name="tests.weekly" value="false"/>
      <param name="tests.badapples" value="true"/>
      <!-- The idea behind Clover is to determine test coverage, so be immune to failing tests: -->
      <param name="tests.haltonfailure" value="false"/>
      
      <target name="clover"/>
      <target name="test"/>
      <target name="-generate-clover-reports"/>
      
      <propertyset refid="uptodate.and.compiled.properties"/>
    </antcall>
  </target>

  <!--
   Run after Junit tests.
   
   This target is in a separate file, as it needs to include common-build.xml,
   but must run from top-level!
   -->
  <target name="-generate-clover-reports" depends="clover">
    <fail unless="run.clover">Clover not enabled!</fail>
    <mkdir dir="${clover.report.dir}"/>
    <fileset dir="." id="clover.test.result.files">
      <include name="*/build/**/test/TEST-*.xml"/>
    </fileset>
    <clover-report projectName="Apache Lucene/Solr">
      <current outfile="${clover.report.dir}" title="Apache Lucene/Solr ${version}" numThreads="0">
        <format type="html" filter="assert"/>
        <testresults refid="clover.test.result.files"/>
      </current>
      <current outfile="${clover.report.dir}/clover.xml" title="Apache Lucene/Solr ${version}">
        <format type="xml" filter="assert"/>
        <testresults refid="clover.test.result.files"/>
      </current>
    </clover-report>
    <echo>You can find the merged Lucene/Solr Clover report in '${clover.report.dir}'.</echo>
  </target>

  <target name="test-with-heapdumps" depends="resolve-groovy,-test-with-heapdumps-enabled,-test-with-heapdumps-disabled" description="Runs tests with heap dumps on OOM enabled (if VM supports this)"/>
  
  <condition property="vm.supports.heapdumps">
    <or>
      <contains string="${java.vm.name}" substring="hotspot" casesensitive="false"/>
      <contains string="${java.vm.name}" substring="openjdk" casesensitive="false"/>
    </or>
  </condition>

  <target name="-test-with-heapdumps-enabled" if="vm.supports.heapdumps">
    <echo level="info" message="${java.vm.name}: Enabling heap dumps on OutOfMemoryError to dir '${tests.heap-dump-dir}'."/>
    <mkdir dir="${tests.heap-dump-dir}"/>
    <delete includeEmptyDirs="true">
      <fileset dir="${tests.heap-dump-dir}"  includes="**/*"/>
    </delete>
    <antcall inheritAll="false" target="test">
      <param name="tests.heapdump.args" value="-XX:+HeapDumpOnOutOfMemoryError &quot;-XX:HeapDumpPath=${tests.heap-dump-dir}&quot;"/>
      <propertyset refid="uptodate.and.compiled.properties"/>
    </antcall>
    <pathconvert property="heapdumps.list" setonempty="false" pathsep="${line.separator}">
      <fileset dir="${tests.heap-dump-dir}"/>
      <map from="${tests.heap-dump-dir}${file.separator}" to="* "/>
    </pathconvert>
    <fail if="heapdumps.list" message="Some of the tests produced a heap dump, but did not fail. Maybe a suppressed OutOfMemoryError? Dumps created:${line.separator}${heapdumps.list}"/>
    <delete dir="${tests.heap-dump-dir}"/>
  </target>

  <target name="-test-with-heapdumps-disabled" unless="vm.supports.heapdumps">
    <echo level="warning" message="WARN: The used JVM (${java.vm.name}) does not support HPROF heap dumps on OutOfMemoryError."/>
    <antcall target="test">
      <propertyset refid="uptodate.and.compiled.properties"/>
    </antcall>
  </target>

  <target name="regenerate" description="Runs all code regenerators">
    <subant target="regenerate" inheritall="false" failonerror="true">
      <fileset dir="lucene" includes="build.xml" />
      <!-- todo:
      <fileset dir="solr" includes="build.xml" />-->
      <propertyset refid="uptodate.and.compiled.properties"/>
    </subant>
  </target>

  <!-- should only be called by jenkins, not precommit! -->
  <target name="-check-after-regeneration" depends="resolve-groovy">
    <wc-checker failonmodifications="true"/>
  </target>

  <!-- TODO: remove me when jenkins works -->
  <target name="regenerateAndCheck" depends="regenerate,-check-after-regeneration"/>
  
  <target name="-append-all-modules-dependencies-properties">
    <delete file="lucene/build/module.dependencies.properties"/>
    <subant target="-append-module-dependencies-properties" inheritall="false" failonerror="true">
      <fileset dir="lucene" includes="build.xml" />
      <fileset dir="solr" includes="build.xml" />
      <propertyset refid="uptodate.and.compiled.properties"/>
    </subant>
  </target>
  
  <!-- Jenkins tasks -->
  <target name="-jenkins-base" depends="-print-java-info,clean,test-with-heapdumps,validate,documentation-lint,jar-checksums,check-working-copy"/>
  
  <target name="-print-java-info">
    <echo level="info" taskname="java-info">java version &quot;${java.version}&quot;
${java.runtime.name} (${java.runtime.version}, ${java.vendor})
${java.vm.name} (${java.vm.version}, ${java.vm.vendor})
Test args: [${args}]</echo>
  </target>
  
  <target name="jenkins-hourly">
    <antcall>
      <param name="is.jenkins.build" value="true"/>
      <target name="-jenkins-base"/>
    </antcall>
  </target>
  
  <target name="jenkins-nightly">
    <antcall>
      <param name="is.jenkins.build" value="true"/>
      <param name="tests.nightly" value="true"/>
      <target name="-jenkins-base"/>
    </antcall>
  </target>
  
  <target name="jenkins-maven-nightly" depends="-print-java-info,clean,clean-maven-build,resolve-groovy,resolve-pegdown,install-maven-tasks">
    <!-- step 1: build, install, deploy, and validate ANT-generated maven artifacts: -->
    <antcall>
      <param name="is.jenkins.build" value="true"/>
      <target name="remove-maven-artifacts"/>
      <!-- this implicitely publishes the maven artifacts: -->
      <target name="validate-maven-dependencies"/>
    </antcall>
    <!-- step 2: run the maven build to check that the pom templates also work to drive "mvn": -->
    <antcall>
      <param name="is.jenkins.build" value="true"/>
      <target name="remove-maven-artifacts"/>
      <target name="run-maven-build"/>
    </antcall>
  </target>
  
  <target name="jenkins-clover" depends="-print-java-info">
    <antcall>
      <param name="is.jenkins.build" value="true"/>
      <target name="run-clover"/>
    </antcall>
  </target>

  <!-- useless targets (override common-build.xml): -->
  <target name="generate-test-reports"/>
</project>
