2012-08-28 02:50:46 -04:00
|
|
|
<?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"/>
|
|
|
|
|
2014-08-28 07:28:53 -04:00
|
|
|
<property name="svnkit.version" value="1.8.5"/>
|
|
|
|
|
2013-11-15 03:37:00 -05:00
|
|
|
<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>
|
|
|
|
|
2012-08-28 02:50:46 -04:00
|
|
|
<!--
|
|
|
|
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!
|
|
|
|
-->
|
2012-09-28 09:44:36 -04:00
|
|
|
<target name="-generate-clover-reports" depends="clover">
|
2012-08-28 02:50:46 -04:00
|
|
|
<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>
|
2014-08-31 17:06:17 -04:00
|
|
|
<clover-report projectName="Apache Lucene/Solr">
|
|
|
|
<current outfile="${clover.report.dir}" title="Apache Lucene/Solr ${version}" numThreads="0">
|
2012-08-28 02:50:46 -04:00
|
|
|
<format type="html" filter="assert"/>
|
|
|
|
<testresults refid="clover.test.result.files"/>
|
|
|
|
</current>
|
2014-08-31 17:06:17 -04:00
|
|
|
<current outfile="${clover.report.dir}/clover.xml" title="Apache Lucene/Solr ${version}">
|
2012-08-28 02:50:46 -04:00
|
|
|
<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>
|
|
|
|
|
2014-09-05 13:30:32 -04:00
|
|
|
<target name="-run-maven-build" depends="install-maven-tasks,resolve-groovy">
|
|
|
|
<groovy><![CDATA[
|
|
|
|
import groovy.xml.NamespaceBuilder;
|
2014-09-06 04:26:15 -04:00
|
|
|
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.') };
|
2014-09-05 13:30:32 -04:00
|
|
|
def artifact = NamespaceBuilder.newInstance(ant, 'antlib:org.apache.maven.artifact.ant');
|
2014-09-06 04:26:15 -04:00
|
|
|
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');
|
2014-09-05 13:30:32 -04:00
|
|
|
};
|
|
|
|
]]></groovy>
|
2012-09-09 05:19:32 -04:00
|
|
|
</target>
|
|
|
|
|
2013-07-23 17:38:51 -04:00
|
|
|
<target name="-check-svn-working-copy" depends="ivy-availability-check,ivy-fail,ivy-configure,resolve-groovy">
|
2013-07-23 17:59:18 -04:00
|
|
|
<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"/>
|
2013-07-23 17:38:51 -04:00
|
|
|
</target>
|
2013-12-03 19:54:08 -05:00
|
|
|
|
2013-07-23 17:38:51 -04:00
|
|
|
<macrodef xmlns:ivy="antlib:org.apache.ivy.ant" name="svn-checker">
|
2013-07-23 17:59:18 -04:00
|
|
|
<attribute name="failonmodifications" default="true"/> <!-- false if file modifications are allowed -->
|
2013-07-23 17:38:51 -04:00
|
|
|
<sequential>
|
2013-12-03 19:54:08 -05:00
|
|
|
<ivy:cachepath organisation="org.tmatesoft.svnkit" module="svnkit" revision="${svnkit.version}"
|
2013-07-08 19:19:37 -04:00
|
|
|
inline="true" conf="default" transitive="true" pathid="svnkit.classpath"/>
|
2013-07-23 17:38:51 -04:00
|
|
|
<local name="svn.checkprops.failed"/>
|
|
|
|
<local name="svn.unversioned.failed"/>
|
2014-08-10 08:35:17 -04:00
|
|
|
<local name="svn.keywords.failed"/>
|
2013-07-23 17:59:18 -04:00
|
|
|
<local name="svn.changed.failed"/>
|
2013-09-14 07:19:33 -04:00
|
|
|
<groovy taskname="svn" classpathref="svnkit.classpath"><![CDATA[
|
2012-09-22 10:42:46 -04:00
|
|
|
import org.tmatesoft.svn.core.*;
|
|
|
|
import org.tmatesoft.svn.core.wc.*;
|
2014-01-06 13:54:50 -05:00
|
|
|
import org.apache.tools.ant.Project;
|
|
|
|
|
2012-09-22 10:42:46 -04:00
|
|
|
SVNClientManager manager = SVNClientManager.newInstance();
|
|
|
|
SVNStatusClient statusClient = manager.getStatusClient();
|
|
|
|
SVNWCClient wcClient = manager.getWCClient();
|
|
|
|
|
2014-08-10 08:35:17 -04:00
|
|
|
File basedir = new File(properties['basedir']).getAbsoluteFile();
|
2012-09-22 10:42:46 -04:00
|
|
|
int baseLen = basedir.toString().length();
|
2014-01-06 13:54:50 -05:00
|
|
|
|
|
|
|
// do some fake check, to verify if this is valid SVN working copy. If this fails ignore checks but log some useful message.
|
2014-01-06 16:56:47 -05:00
|
|
|
task.log('Initializing working copy...');
|
2014-01-06 13:54:50 -05:00
|
|
|
try {
|
2014-01-06 16:56:47 -05:00
|
|
|
wcClient.doInfo(basedir, SVNRevision.WORKING);
|
2014-01-06 13:54:50 -05:00
|
|
|
} catch (SVNException ex) {
|
2014-01-06 14:16:10 -05:00
|
|
|
def ec = ex.getErrorMessage().getErrorCode();
|
|
|
|
int code = ec.getCode();
|
|
|
|
int category = ec.getCategory();
|
2014-03-09 11:43:22 -04:00
|
|
|
if (code == SVNErrorCode.WC_NOT_DIRECTORY.getCode() || code == SVNErrorCode.WC_NOT_FILE.getCode()) {
|
2014-01-06 13:54:50 -05:00
|
|
|
task.log('WARNING: Development directory is not an SVN checkout! Disabling checks...', Project.MSG_WARN);
|
|
|
|
return;
|
2014-01-06 14:16:10 -05:00
|
|
|
} else if (category == SVNErrorCode.WC_CATEGORY) {
|
2014-01-06 13:54:50 -05:00
|
|
|
task.log('WARNING: Development directory is not a valid SVN checkout (' + ex.getErrorMessage() + '). Disabling checks...', Project.MSG_WARN);
|
|
|
|
return;
|
2014-01-06 14:16:10 -05:00
|
|
|
} else {
|
|
|
|
throw ex;
|
2014-01-06 13:54:50 -05:00
|
|
|
}
|
|
|
|
}
|
2012-08-28 02:50:46 -04:00
|
|
|
|
2014-01-06 16:56:47 -05:00
|
|
|
def convertRelative = {
|
|
|
|
file -> '.' + file.getAbsolutePath().substring(baseLen).replace(File.separatorChar, (char)'/');
|
|
|
|
}
|
|
|
|
|
2014-08-06 23:25:40 -04:00
|
|
|
Set missingProps = new TreeSet(), withKeywords = new TreeSet(), unversioned = new TreeSet(), changed = new TreeSet();
|
2012-08-28 02:50:46 -04:00
|
|
|
|
2013-09-14 07:19:33 -04:00
|
|
|
task.log('Getting all versioned and unversioned files...');
|
2012-09-22 10:42:46 -04:00
|
|
|
statusClient.doStatus(basedir, SVNRevision.WORKING, SVNDepth.fromRecurse(true), false, true, false, false, {
|
|
|
|
status ->
|
|
|
|
SVNStatusType nodeStatus = status.getNodeStatus();
|
2013-04-22 10:49:54 -04:00
|
|
|
if (nodeStatus == SVNStatusType.STATUS_UNVERSIONED || nodeStatus == SVNStatusType.STATUS_MISSING) {
|
2012-09-22 10:42:46 -04:00
|
|
|
unversioned.add(convertRelative(status.getFile()));
|
|
|
|
} else if (status.getKind() == SVNNodeKind.FILE && nodeStatus != SVNStatusType.STATUS_DELETED) {
|
|
|
|
missingProps.add(convertRelative(status.getFile()));
|
2012-08-28 02:50:46 -04:00
|
|
|
}
|
2013-07-24 09:37:39 -04:00
|
|
|
if (nodeStatus == SVNStatusType.STATUS_MODIFIED || nodeStatus == SVNStatusType.STATUS_REPLACED ||
|
|
|
|
nodeStatus == SVNStatusType.STATUS_DELETED || nodeStatus == SVNStatusType.STATUS_ADDED) {
|
|
|
|
changed.add(convertRelative(status.getFile()));
|
2013-07-23 17:59:18 -04:00
|
|
|
}
|
2012-09-22 10:42:46 -04:00
|
|
|
} as ISVNStatusHandler, null);
|
2012-08-28 02:50:46 -04:00
|
|
|
|
2013-09-14 07:19:33 -04:00
|
|
|
task.log('Filtering files with existing svn:eol-style...');
|
2012-09-22 10:42:46 -04:00
|
|
|
wcClient.doGetProperty(basedir, 'svn:eol-style', SVNRevision.WORKING, SVNRevision.WORKING, true, {
|
|
|
|
file, prop -> missingProps.remove(convertRelative(file));
|
|
|
|
} as ISVNPropertyHandler);
|
2012-08-28 02:50:46 -04:00
|
|
|
|
2013-09-14 07:19:33 -04:00
|
|
|
task.log('Filtering files with binary svn:mime-type...');
|
2012-09-22 10:42:46 -04:00
|
|
|
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));
|
2012-08-28 02:50:46 -04:00
|
|
|
}
|
2012-09-22 10:42:46 -04:00
|
|
|
} as ISVNPropertyHandler);
|
2012-08-28 02:50:46 -04:00
|
|
|
|
2014-08-06 23:25:40 -04:00
|
|
|
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);
|
|
|
|
|
2014-08-10 08:35:17 -04:00
|
|
|
def setProjectPropertyFromSet(prop, set) {
|
|
|
|
if (set) {
|
|
|
|
properties[prop] = '* ' + set.join(properties['line.separator'] + '* ');
|
|
|
|
}
|
2012-08-28 02:50:46 -04:00
|
|
|
};
|
2014-08-10 08:35:17 -04:00
|
|
|
setProjectPropertyFromSet('svn.checkprops.failed', missingProps);
|
|
|
|
setProjectPropertyFromSet('svn.keywords.failed', withKeywords);
|
|
|
|
setProjectPropertyFromSet('svn.unversioned.failed', unversioned);
|
|
|
|
setProjectPropertyFromSet('svn.changed.failed', changed);
|
2013-09-14 07:19:33 -04:00
|
|
|
]]></groovy>
|
2012-08-28 02:50:46 -04:00
|
|
|
<fail if="svn.checkprops.failed"
|
|
|
|
message="The following files are missing svn:eol-style (or binary svn:mime-type):${line.separator}${svn.checkprops.failed}"/>
|
2014-08-06 23:25:40 -04:00
|
|
|
<fail if="svn.keywords.failed"
|
|
|
|
message="The following files have the svn:keywords property set:${line.separator}${svn.keywords.failed}"/>
|
2012-08-28 02:50:46 -04:00
|
|
|
<fail if="svn.unversioned.failed"
|
|
|
|
message="Source checkout is dirty after running tests!!! Offending files:${line.separator}${svn.unversioned.failed}"/>
|
2013-07-23 17:59:18 -04:00
|
|
|
<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>
|
2013-07-23 17:38:51 -04:00
|
|
|
</sequential>
|
|
|
|
</macrodef>
|
2012-08-28 02:50:46 -04:00
|
|
|
</project>
|