git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@358863 13f79535-47bb-0310-9956-ffa450edef68master
@@ -335,6 +335,8 @@ Other changes: | |||
* add textfile attribute to the filesmatch condition. | |||
* new resourcesmatch condition. | |||
Changes from Ant 1.6.4 to Ant 1.6.5 | |||
=================================== | |||
@@ -221,7 +221,8 @@ TCP/IP listener at the specified host and port.</p> | |||
</table> | |||
<h4>filesmatch</h4> | |||
<p>Test two files for matching. Nonexistence of either file results in "false". | |||
<p>Test two files for matching. Nonexistence of one file results in "false", | |||
although if neither exists they are considered equal in terms of content. | |||
This test does a byte for byte comparision, so test time scales with | |||
byte size. NB: if the files are different sizes, one of them is missing | |||
or the filenames match the answer is so obvious the detailed test is omitted. | |||
@@ -245,8 +246,9 @@ or the filenames match the answer is so obvious the detailed test is omitted. | |||
</tr> | |||
<tr> | |||
<td valign="top">textfile</td> | |||
<td valign="top">Whether to ignore line endings when comparing files; | |||
default <i>false</i> | |||
<td valign="top">Whether to ignore line endings | |||
when comparing files; defaults to <i>false</i>, while | |||
<i>true</i> bypasses the size comparison. | |||
</td> | |||
<td align="center">No</td> | |||
</tr> | |||
@@ -676,6 +678,34 @@ Probe for the maven repository being reachable using the hostname, ten second ti | |||
<resourcecount refid="myresourcecollection" when="greater" length="0" /> | |||
</pre> | |||
<p>Verify that a resource collection is not empty.</p> | |||
<h4>resourcesmatch</h4> | |||
<p>Test resources for matching. Nonexistence of one or more resources results in | |||
"false", although if none exists they are considered equal in terms of content. | |||
By default this test does a byte for byte comparision, so test time scales with | |||
byte size. NB: if the files are different sizes, one of them is missing | |||
or the filenames match the answer is so obvious the detailed test is omitted. | |||
The resources to check are specified as nested | |||
<a href="../CoreTypes/resources.html#collection">resource collections</a>, | |||
meaning that more than two resources can be checked; in this case all resources | |||
must match. <b>Since Ant 1.7</b> | |||
</p> | |||
<table border="1" cellpadding="2" cellspacing="0"> | |||
<tr> | |||
<td width="12%" valign="top"><b>Attribute</b></td> | |||
<td width="78%" valign="top"><b>Description</b></td> | |||
<td width="10%" valign="top"><b>Required</b></td> | |||
</tr> | |||
<tr> | |||
<td valign="top">astext</td> | |||
<td valign="top">Whether to ignore line endings | |||
when comparing resource content; defaults to <i>false</i>, | |||
while <i>true</i> bypasses the size comparison. | |||
</td> | |||
<td align="center">No</td> | |||
</tr> | |||
</table> | |||
<hr> | |||
<p align="center">Copyright © 2001-2005 Apache Software | |||
Foundation. All rights Reserved.</p> | |||
@@ -185,6 +185,16 @@ | |||
<echo>${filesmatch-existence}</echo> | |||
</target> | |||
<target name="filesmatch-neitherexist"> | |||
<fail> | |||
<condition> | |||
<not> | |||
<filesmatch file1="idonotexist" file2="andneitherdoi" /> | |||
</not> | |||
</condition> | |||
</fail> | |||
</target> | |||
<target name="filesmatch-different"> | |||
<echo file="match1.txt" message="012345676890" /> | |||
<echo file="match2.txt" message="012345676889" /> | |||
@@ -395,6 +405,97 @@ | |||
</fail> | |||
</target> | |||
<target name="resourcesmatch-error"> | |||
<condition property="errorexpected"> | |||
<resourcesmatch /> | |||
</condition> | |||
</target> | |||
<target name="resourcesmatch-match-empty"> | |||
<condition property="errorexpected"> | |||
<resourcesmatch> | |||
<resources /> | |||
</resourcesmatch> | |||
</condition> | |||
</target> | |||
<target name="resourcesmatch-match-one"> | |||
<condition property="errorexpected"> | |||
<resourcesmatch> | |||
<string value="foo" /> | |||
</resourcesmatch> | |||
</condition> | |||
</target> | |||
<target name="resourcesmatch-match-binary"> | |||
<fail> | |||
<condition> | |||
<not> | |||
<resourcesmatch> | |||
<string value="foo" /> | |||
<string value="foo" /> | |||
</resourcesmatch> | |||
</not> | |||
</condition> | |||
</fail> | |||
</target> | |||
<target name="resourcesmatch-match-multiple-binary"> | |||
<fail> | |||
<condition> | |||
<not> | |||
<resourcesmatch> | |||
<string value="foo" /> | |||
<string value="foo" /> | |||
<string value="foo" /> | |||
</resourcesmatch> | |||
</not> | |||
</condition> | |||
</fail> | |||
</target> | |||
<target name="resourcesmatch-differ"> | |||
<echo file="match11.txt" message="foo" /> | |||
<fixcrlf file="match11.txt" eol="crlf" fixlast="true" /> | |||
<fail> | |||
<condition> | |||
<resourcesmatch> | |||
<file file="match11.txt" /> | |||
<string value="foo" /> | |||
</resourcesmatch> | |||
</condition> | |||
</fail> | |||
</target> | |||
<target name="resourcesmatch-match-text"> | |||
<echo file="match11.txt" message="foo" /> | |||
<fixcrlf file="match11.txt" eol="crlf" /> | |||
<fail> | |||
<condition> | |||
<not> | |||
<resourcesmatch astext="true"> | |||
<file file="match11.txt" /> | |||
<string value="foo" /> | |||
</resourcesmatch> | |||
</not> | |||
</condition> | |||
</fail> | |||
</target> | |||
<target name="resourcesmatch-noneexist"> | |||
<fail> | |||
<condition> | |||
<not> | |||
<resourcesmatch> | |||
<resource name="foo" exists="false" /> | |||
<resource name="bar" exists="false" /> | |||
<resource name="baz" exists="false" /> | |||
</resourcesmatch> | |||
</not> | |||
</condition> | |||
</fail> | |||
</target> | |||
<target name="cleanup" > | |||
<delete> | |||
<fileset dir="." includes="match?.txt,match??.txt" /> | |||
@@ -0,0 +1,92 @@ | |||
/* | |||
* Copyright 2005 The Apache Software Foundation | |||
* | |||
* Licensed 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. | |||
* | |||
*/ | |||
package org.apache.tools.ant.taskdefs.condition; | |||
import java.io.IOException; | |||
import java.util.Iterator; | |||
import org.apache.tools.ant.BuildException; | |||
import org.apache.tools.ant.types.Resource; | |||
import org.apache.tools.ant.types.ResourceCollection; | |||
import org.apache.tools.ant.types.resources.Union; | |||
import org.apache.tools.ant.util.ResourceUtils; | |||
/** | |||
* Compares resources for equality based on size and content. | |||
* All resources specified must match; no resource collections | |||
* specified is an error condition; if resource collections are | |||
* specified, but yield fewer than two elements, the condition | |||
* evaluates to <code>true</code>. | |||
* @since Ant 1.7 | |||
*/ | |||
public class ResourcesMatch implements Condition { | |||
private Union resources = null; | |||
private boolean asText = false; | |||
/** | |||
* Set whether to treat resources as if they were text files, | |||
* ignoring line endings. | |||
* @param astext whether to ignore line endings. | |||
*/ | |||
public void setAsText(boolean asText) { | |||
this.asText = asText; | |||
} | |||
/** | |||
* Add a resource collection. | |||
* @param rc the resource collection to add. | |||
*/ | |||
public void add(ResourceCollection rc) { | |||
if (rc == null) { | |||
return; | |||
} | |||
resources = resources == null ? new Union() : resources; | |||
resources.add(rc); | |||
} | |||
/** | |||
* Verify that all resources match. | |||
* @return true if all resources are equal. | |||
* @exception BuildException if there is an error. | |||
*/ | |||
public boolean eval() throws BuildException { | |||
if (resources == null) { | |||
throw new BuildException( | |||
"You must specify one or more nested resource collections"); | |||
} | |||
if (resources.size() > 1) { | |||
Iterator i = resources.iterator(); | |||
Resource r1 = (Resource) i.next(); | |||
Resource r2 = null; | |||
while (i.hasNext()) { | |||
r2 = (Resource) i.next(); | |||
try { | |||
if (!ResourceUtils.contentEquals(r1, r2, asText)) { | |||
return false; | |||
} | |||
} catch (IOException ioe) { | |||
throw new BuildException("when comparing resources " | |||
+ r1.toString() + " and " + r2.toString(), ioe); | |||
} | |||
r1 = r2; | |||
} | |||
} | |||
return true; | |||
} | |||
} |
@@ -4,6 +4,21 @@ filterreader=org.apache.tools.ant.types.AntFilterReader | |||
filterset=org.apache.tools.ant.types.FilterSet | |||
mapper=org.apache.tools.ant.types.Mapper | |||
redirector=org.apache.tools.ant.types.RedirectorElement | |||
patternset=org.apache.tools.ant.types.PatternSet | |||
regexp=org.apache.tools.ant.types.RegularExpression | |||
substitution=org.apache.tools.ant.types.Substitution | |||
xmlcatalog=org.apache.tools.ant.types.XMLCatalog | |||
extensionSet=org.apache.tools.ant.taskdefs.optional.extension.ExtensionSet | |||
extension=org.apache.tools.ant.taskdefs.optional.extension.ExtensionAdapter | |||
selector=org.apache.tools.ant.types.selectors.SelectSelector | |||
signedselector=org.apache.tools.ant.types.selectors.SignedSelector | |||
scriptfilter=org.apache.tools.ant.types.optional.ScriptFilter | |||
assertions=org.apache.tools.ant.types.Assertions | |||
concatfilter=org.apache.tools.ant.filters.ConcatFilter | |||
mavenrepository=org.apache.tools.ant.taskdefs.repository.MavenRepository | |||
scriptselector=org.apache.tools.ant.types.optional.ScriptSelector | |||
scriptmapper=org.apache.tools.ant.types.optional.ScriptMapper | |||
# different filename mappers | |||
identitymapper=org.apache.tools.ant.util.IdentityMapper | |||
flattenmapper=org.apache.tools.ant.util.FlatFileNameMapper | |||
@@ -16,27 +31,15 @@ compositemapper=org.apache.tools.ant.util.CompositeMapper | |||
chainedmapper=org.apache.tools.ant.util.ChainedMapper | |||
filtermapper=org.apache.tools.ant.types.mappers.FilterMapper | |||
patternset=org.apache.tools.ant.types.PatternSet | |||
regexp=org.apache.tools.ant.types.RegularExpression | |||
substitution=org.apache.tools.ant.types.Substitution | |||
xmlcatalog=org.apache.tools.ant.types.XMLCatalog | |||
extensionSet=org.apache.tools.ant.taskdefs.optional.extension.ExtensionSet | |||
extension=org.apache.tools.ant.taskdefs.optional.extension.ExtensionAdapter | |||
selector=org.apache.tools.ant.types.selectors.SelectSelector | |||
signedselector=org.apache.tools.ant.types.selectors.SignedSelector | |||
scriptfilter=org.apache.tools.ant.types.optional.ScriptFilter | |||
assertions=org.apache.tools.ant.types.Assertions | |||
concatfilter=org.apache.tools.ant.filters.ConcatFilter | |||
#conditions: | |||
issigned=org.apache.tools.ant.taskdefs.condition.IsSigned | |||
isfileselected=org.apache.tools.ant.taskdefs.condition.IsFileSelected | |||
isreachable=org.apache.tools.ant.taskdefs.condition.IsReachable | |||
mavenrepository=org.apache.tools.ant.taskdefs.repository.MavenRepository | |||
scriptselector=org.apache.tools.ant.types.optional.ScriptSelector | |||
scriptcondition=org.apache.tools.ant.types.optional.ScriptCondition | |||
xor=org.apache.tools.ant.taskdefs.condition.Xor | |||
parsersupports=org.apache.tools.ant.taskdefs.condition.ParserSupports | |||
scriptmapper=org.apache.tools.ant.types.optional.ScriptMapper | |||
isfailure=org.apache.tools.ant.taskdefs.condition.IsFailure | |||
resourcesmatch=org.apache.tools.ant.taskdefs.condition.ResourcesMatch | |||
#ResourceCollections: | |||
dirset=org.apache.tools.ant.types.DirSet | |||
@@ -170,6 +170,10 @@ public class ConditionTest extends BuildFileTest { | |||
executeTarget("filesmatch-same-eol"); | |||
} | |||
public void testFilesmatchNeitherExist() { | |||
executeTarget("filesmatch-neitherexist"); | |||
} | |||
public void testContains() { | |||
expectPropertySet("contains","contains"); | |||
} | |||
@@ -237,5 +241,37 @@ public class ConditionTest extends BuildFileTest { | |||
public void testElse() { | |||
executeTarget("testElse"); | |||
} | |||
} | |||
public void testResourcesmatchError() { | |||
expectBuildException("resourcesmatch-error", | |||
"should fail because no resources specified"); | |||
} | |||
public void testResourcesmatchEmpty() { | |||
executeTarget("resourcesmatch-match-empty"); | |||
} | |||
public void testResourcesmatchOne() { | |||
executeTarget("resourcesmatch-match-one"); | |||
} | |||
public void testResourcesmatchBinary() { | |||
executeTarget("resourcesmatch-match-binary"); | |||
} | |||
public void testResourcesmatchMultipleBinary() { | |||
executeTarget("resourcesmatch-match-multiple-binary"); | |||
} | |||
public void testResourcesmatchDiffer() { | |||
executeTarget("resourcesmatch-differ"); | |||
} | |||
public void testResourcesmatchText() { | |||
executeTarget("resourcesmatch-match-text"); | |||
} | |||
public void testResourcesmatchNoneExist() { | |||
executeTarget("resourcesmatch-noneexist"); | |||
} | |||
} |