| <?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"/> |
| |
| <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"/> |
| <exclude name="lucene/build/backwards/**"/> |
| </fileset> |
| <clover-report> |
| <current outfile="${clover.report.dir}" title="${final.name}" numThreads="0"> |
| <format type="html" filter="assert"/> |
| <testresults refid="clover.test.result.files"/> |
| </current> |
| <current outfile="${clover.report.dir}/clover.xml" title="${final.name}"> |
| <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"> |
| <mvn xmlns="antlib:org.apache.maven.artifact.ant" pom="${maven-build-dir}/pom.xml" |
| mavenVersion="${maven-version}" failonerror="true" fork="true"> |
| <arg value="-fae"/> |
| <arg value="install"/> |
| <syspropertyset> |
| <propertyref builtin="commandline"/> |
| </syspropertyset> |
| </mvn> |
| </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> |
| |
| <property name="svnkit.version" value="1.8.5"/> |
| |
| <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> |