Bugzilla 40019. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@467828 13f79535-47bb-0310-9956-ffa450edef68master
@@ -24,6 +24,9 @@ Other changes: | |||||
* removed dependence on sun.misc.UUEncoder for UUMailer. | * removed dependence on sun.misc.UUEncoder for UUMailer. | ||||
* added regex attribute to the echoproperties task. | |||||
Bugzilla 40019. | |||||
Changes from Ant 1.7.0Beta2 to Ant 1.7.0Beta3 | Changes from Ant 1.7.0Beta2 to Ant 1.7.0Beta3 | ||||
============================================= | ============================================= | ||||
@@ -58,9 +58,15 @@ files.</p> | |||||
</td> | </td> | ||||
<td valign="top" align="center">No</td> | <td valign="top" align="center">No</td> | ||||
</tr> | </tr> | ||||
<tr> | |||||
<td valign="top">regex</td> | |||||
<td valign="top"> | |||||
a regular expression which is used to filter the | |||||
properties | |||||
only those properties whose names match it will be echoed. | |||||
</td> | |||||
<td valign="top" align="center">No</td> | |||||
</tr> | |||||
<tr> | <tr> | ||||
<td valign="top">failonerror</td> | <td valign="top">failonerror</td> | ||||
<td valign="top">By default, the "failonerror" attribute is enabled. | <td valign="top">By default, the "failonerror" attribute is enabled. | ||||
@@ -70,7 +76,6 @@ files.</p> | |||||
statement, and the build will continue without failure from this task.</td> | statement, and the build will continue without failure from this task.</td> | ||||
<td valign="top" align="center">No</td> | <td valign="top" align="center">No</td> | ||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
<td valign="top">format</td> | <td valign="top">format</td> | ||||
<td valign="top">One of <code>text</code> or <code>xml</code>. | <td valign="top">One of <code>text</code> or <code>xml</code>. | ||||
@@ -84,7 +89,11 @@ files.</p> | |||||
<h4>propertyset</h4> | <h4>propertyset</h4> | ||||
<p>You can specify subsets of properties to be echoed with <a | <p>You can specify subsets of properties to be echoed with <a | ||||
href="../CoreTypes/propertyset.html">propertyset</a>s.</p> | |||||
href="../CoreTypes/propertyset.html">propertyset</a>s. Using | |||||
<tt>propertyset</tt>s gives more control on which properties will be | |||||
picked up. The attributes <tt>prefix</tt> and <tt>regex</tt> are just | |||||
shorcuts that use <tt>propertyset</tt>s internally. | |||||
</p> | |||||
<p><em>since Ant 1.6</em>.</p> | <p><em>since Ant 1.6</em>.</p> | ||||
@@ -115,7 +124,20 @@ allow the build to continue.</p> | |||||
</propertyset> | </propertyset> | ||||
</echoproperties> | </echoproperties> | ||||
</pre></blockquote> | </pre></blockquote> | ||||
<p>List all properties beginning with "java."</p> | |||||
<p>This again lists all properties beginning with "java." using a nested | |||||
<tt></propertyset></tt> which is an equivalent but longer way.</p> | |||||
<blockquote><pre> | |||||
<echoproperties regex=".*ant.*"/> | |||||
</pre></blockquote> | |||||
<p>Lists all properties that contain "ant" in their names. | |||||
The equivalent snippet with <tt></propertyset></tt> is:</p> | |||||
<blockquote><pre> | |||||
<echoproperties> | |||||
<propertyset> | |||||
<propertyref regex=".*ant.*"/> | |||||
</propertyset> | |||||
</echoproperties> | |||||
</pre></blockquote> | |||||
@@ -94,6 +94,18 @@ | |||||
</echoproperties> | </echoproperties> | ||||
</target> | </target> | ||||
<target name="testWithPrefixAndRegex" depends="setup"> | |||||
<echoproperties prefix="ant." regex=".*ant.*"/> | |||||
</target> | |||||
<target name="testWithEmptyPrefixAndRegex" depends="setup"> | |||||
<echoproperties prefix="" regex=""/> | |||||
</target> | |||||
<target name="testWithRegex" depends="setup"> | |||||
<echoproperties regex=".*ant.*"/> | |||||
</target> | |||||
<target name="cleanup"> | <target name="cleanup"> | ||||
<delete file="test.properties" failonerror="no" /> | <delete file="test.properties" failonerror="no" /> | ||||
<delete file="test-prefix.properties" failonerror="no" /> | <delete file="test-prefix.properties" failonerror="no" /> | ||||
@@ -129,6 +129,13 @@ public class EchoProperties extends Task { | |||||
private String format = "text"; | private String format = "text"; | ||||
private String prefix; | |||||
/** | |||||
* @since Ant 1.7 | |||||
*/ | |||||
private String regex; | |||||
/** | /** | ||||
* Sets the input file. | * Sets the input file. | ||||
* | * | ||||
@@ -163,19 +170,20 @@ public class EchoProperties extends Task { | |||||
/** | /** | ||||
* If the prefix is set, then only properties which start with this | * If the prefix is set, then only properties which start with this | ||||
* prefix string will be recorded. If this is never set, or it is set | |||||
* to an empty string or <tt>null</tt>, then all properties will be | |||||
* recorded. <P> | |||||
* prefix string will be recorded. If regex is not set and if this | |||||
* is never set, or it is set to an empty string or <tt>null</tt>, | |||||
* then all properties will be recorded. <P> | |||||
* | * | ||||
* For example, if the property is set as: | |||||
* For example, if the attribute is set as: | |||||
* <PRE><echoproperties prefix="ant." /></PRE> | * <PRE><echoproperties prefix="ant." /></PRE> | ||||
* then the property "ant.home" will be recorded, but "ant-example" | * then the property "ant.home" will be recorded, but "ant-example" | ||||
* will not. | * will not. | ||||
* | * | ||||
*@param prefix The new prefix value | |||||
* @param prefix The new prefix value | |||||
*/ | */ | ||||
public void setPrefix(String prefix) { | public void setPrefix(String prefix) { | ||||
if (prefix != null && prefix.length() != 0) { | if (prefix != null && prefix.length() != 0) { | ||||
this.prefix = prefix; | |||||
PropertySet ps = new PropertySet(); | PropertySet ps = new PropertySet(); | ||||
ps.setProject(getProject()); | ps.setProject(getProject()); | ||||
ps.appendPrefix(prefix); | ps.appendPrefix(prefix); | ||||
@@ -183,6 +191,31 @@ public class EchoProperties extends Task { | |||||
} | } | ||||
} | } | ||||
/** | |||||
* If the regex is set, then only properties whose names match it | |||||
* will be recorded. If prefix is not set and if this is never set, | |||||
* or it is set to an empty string or <tt>null</tt>, then all | |||||
* properties will be recorded.<P> | |||||
* | |||||
* For example, if the attribute is set as: | |||||
* <PRE><echoproperties prefix=".*ant.*" /></PRE> | |||||
* then the properties "ant.home" and "user.variant" will be recorded, | |||||
* but "ant-example" will not. | |||||
* | |||||
* @param regex The new regex value | |||||
* | |||||
* @since Ant 1.7 | |||||
*/ | |||||
public void setRegex(String regex) { | |||||
if (regex != null && regex.length() != 0) { | |||||
this.regex = regex; | |||||
PropertySet ps = new PropertySet(); | |||||
ps.setProject(getProject()); | |||||
ps.appendRegex(regex); | |||||
addPropertyset(ps); | |||||
} | |||||
} | |||||
/** | /** | ||||
* A set of properties to write. | * A set of properties to write. | ||||
* @param ps the property set to write | * @param ps the property set to write | ||||
@@ -209,6 +242,7 @@ public class EchoProperties extends Task { | |||||
/** | /** | ||||
* @see EnumeratedAttribute#getValues() | * @see EnumeratedAttribute#getValues() | ||||
* @return accepted values | |||||
*/ | */ | ||||
public String[] getValues() { | public String[] getValues() { | ||||
return formats; | return formats; | ||||
@@ -221,6 +255,10 @@ public class EchoProperties extends Task { | |||||
*@exception BuildException trouble, probably file IO | *@exception BuildException trouble, probably file IO | ||||
*/ | */ | ||||
public void execute() throws BuildException { | public void execute() throws BuildException { | ||||
if (prefix != null && regex != null) { | |||||
throw new BuildException("Please specify either prefix" | |||||
+ " or regex, but not both", getLocation()); | |||||
} | |||||
//copy the properties file | //copy the properties file | ||||
Hashtable allProps = new Hashtable(); | Hashtable allProps = new Hashtable(); | ||||
@@ -161,6 +161,22 @@ public class EchoPropertiesTest extends BuildFileTest { | |||||
testEchoPrefixVarious("testEchoPrefixAsDoublyNegatedPropertyset"); | testEchoPrefixVarious("testEchoPrefixAsDoublyNegatedPropertyset"); | ||||
} | } | ||||
public void testWithPrefixAndRegex() throws Exception { | |||||
expectSpecificBuildException("testWithPrefixAndRegex", | |||||
"The target must fail with prefix and regex attributes set", | |||||
"Please specify either prefix or regex, but not both"); | |||||
} | |||||
public void testWithEmptyPrefixAndRegex() throws Exception { | |||||
expectLogContaining("testEchoWithEmptyPrefixToLog", "test.property="+TEST_VALUE); | |||||
} | |||||
public void testWithRegex() throws Exception { | |||||
executeTarget("testWithRegex"); | |||||
assertDebuglogContaining("ant.home="); | |||||
assertDebuglogContaining("user.variant="); | |||||
} | |||||
private void testEchoPrefixVarious(String target) throws Exception { | private void testEchoPrefixVarious(String target) throws Exception { | ||||
executeTarget(target); | executeTarget(target); | ||||
Properties props = loadPropFile(PREFIX_OUTFILE); | Properties props = loadPropFile(PREFIX_OUTFILE); | ||||