<?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="extra-targets" basedir=".">
  <description>
    This file is designed for importing into a main build file, and not intended
    for standalone use.
  </description>
  
  <import file="lucene/common-build.xml"/>

  <property name="svnkit.version" value="1.8.5"/>

  <target name="-run-test">
    <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>
        <propertyref name="tests.totals.tmpfile" />
      </propertyset>      
    </subant>

    <property name="tests.totals.toplevel" value="true" />
    <antcall target="-check-totals" />
  </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="-run-maven-build" depends="install-maven-tasks,resolve-groovy">
    <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="-check-svn-working-copy" depends="ivy-availability-check,ivy-fail,ivy-configure,resolve-groovy">
    <svn-checker failonmodifications="false"/>
  </target>

  <!-- should only be called by jenkins, not precommit! -->
  <target name="-check-after-regeneration" depends="ivy-availability-check,ivy-fail,ivy-configure,resolve-groovy">
    <svn-checker failonmodifications="true"/>
  </target>
  
  <macrodef xmlns:ivy="antlib:org.apache.ivy.ant" name="svn-checker">
    <attribute name="failonmodifications" default="true"/> <!-- false if file modifications are allowed -->
    <sequential>
    <ivy:cachepath organisation="org.tmatesoft.svnkit" module="svnkit" revision="${svnkit.version}"
      inline="true" conf="default" transitive="true" pathid="svnkit.classpath"/>
    <local name="svn.checkprops.failed"/>
    <local name="svn.unversioned.failed"/>
    <local name="svn.keywords.failed"/>
    <local name="svn.changed.failed"/>
    <groovy taskname="svn" classpathref="svnkit.classpath"><![CDATA[
      import org.tmatesoft.svn.core.*;
      import org.tmatesoft.svn.core.wc.*;
      import org.apache.tools.ant.Project;
      
      SVNClientManager manager = SVNClientManager.newInstance();
      SVNStatusClient statusClient = manager.getStatusClient();
      SVNWCClient wcClient = manager.getWCClient();
      
      File basedir = new File(properties['basedir']).getAbsoluteFile();
      int baseLen = basedir.toString().length();

      // do some fake check, to verify if this is valid SVN working copy. If this fails ignore checks but log some useful message.
      task.log('Initializing working copy...');
      try {
        wcClient.doInfo(basedir, SVNRevision.WORKING);
      } catch (SVNException ex) {
        def ec = ex.getErrorMessage().getErrorCode();
        int code = ec.getCode();
        int category = ec.getCategory();
        if (code == SVNErrorCode.WC_NOT_DIRECTORY.getCode() || code == SVNErrorCode.WC_NOT_FILE.getCode()) {
          task.log('WARNING: Development directory is not an SVN checkout! Disabling checks...', Project.MSG_WARN);
          return;
        } else if (category == SVNErrorCode.WC_CATEGORY) {
          task.log('WARNING: Development directory is not a valid SVN checkout (' + ex.getErrorMessage() + '). Disabling checks...', Project.MSG_WARN);
          return;
        } else {
          throw ex;
        }
      }
      
      def convertRelative = {
        file -> '.' + file.getAbsolutePath().substring(baseLen).replace(File.separatorChar, (char)'/');
      }

      Set missingProps = new TreeSet(), withKeywords = new TreeSet(), unversioned = new TreeSet(), changed = new TreeSet();

      task.log('Getting all versioned and unversioned files...');
      statusClient.doStatus(basedir, SVNRevision.WORKING, SVNDepth.fromRecurse(true), false, true, false, false, {
        status ->
        SVNStatusType nodeStatus = status.getNodeStatus();
        if (nodeStatus == SVNStatusType.STATUS_UNVERSIONED || nodeStatus == SVNStatusType.STATUS_MISSING) {
          unversioned.add(convertRelative(status.getFile()));
        } else if (status.getKind() == SVNNodeKind.FILE && nodeStatus != SVNStatusType.STATUS_DELETED) {
          missingProps.add(convertRelative(status.getFile()));
        }
        if (nodeStatus == SVNStatusType.STATUS_MODIFIED || nodeStatus == SVNStatusType.STATUS_REPLACED ||
            nodeStatus == SVNStatusType.STATUS_DELETED  || nodeStatus == SVNStatusType.STATUS_ADDED) {
          changed.add(convertRelative(status.getFile()));
        }
      } as ISVNStatusHandler, null);

      task.log('Filtering files with existing svn:eol-style...');
      wcClient.doGetProperty(basedir, 'svn:eol-style', SVNRevision.WORKING, SVNRevision.WORKING, true, {
        file, prop -> missingProps.remove(convertRelative(file));
      } as ISVNPropertyHandler);
      
      task.log('Filtering files with binary svn:mime-type...');
      wcClient.doGetProperty(basedir, 'svn:mime-type', SVNRevision.WORKING, SVNRevision.WORKING, true, {
        file, prop ->
        prop = SVNPropertyValue.getPropertyAsString(prop.getValue());
        if (prop.startsWith('application/') || prop.startsWith('image/')) {
          missingProps.remove(convertRelative(file));
        }
      } as ISVNPropertyHandler);
      
      task.log('Scanning for files with svn:keywords property...');
      wcClient.doGetProperty(basedir, 'svn:keywords', SVNRevision.WORKING, SVNRevision.WORKING, true, {
        file, prop -> withKeywords.add(convertRelative(file));
      } as ISVNPropertyHandler);
      
      def setProjectPropertyFromSet(prop, set) {
        if (set) {
          properties[prop] = '* ' + set.join(properties['line.separator'] + '* ');
        }
      };
      setProjectPropertyFromSet('svn.checkprops.failed', missingProps);
      setProjectPropertyFromSet('svn.keywords.failed', withKeywords);
      setProjectPropertyFromSet('svn.unversioned.failed', unversioned);
      setProjectPropertyFromSet('svn.changed.failed', changed);
    ]]></groovy>
    <fail if="svn.checkprops.failed"
      message="The following files are missing svn:eol-style (or binary svn:mime-type):${line.separator}${svn.checkprops.failed}"/>
    <fail if="svn.keywords.failed"
      message="The following files have the svn:keywords property set:${line.separator}${svn.keywords.failed}"/>
    <fail if="svn.unversioned.failed"
      message="Source checkout is dirty after running tests!!! Offending files:${line.separator}${svn.unversioned.failed}"/>
    <fail message="Source checkout is modified !!! Offending files:${line.separator}${svn.changed.failed}">
      <condition>
        <and>
           <istrue value="@{failonmodifications}"/>
           <isset property="svn.changed.failed"/>
        </and>
      </condition>
    </fail>
    </sequential>
  </macrodef>
</project>
