git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@816591 13f79535-47bb-0310-9956-ffa450edef68master
@@ -976,6 +976,10 @@ Other changes: | |||||
* <property location="from" basedir="to" relative="true"/> can now | * <property location="from" basedir="to" relative="true"/> can now | ||||
calculate relative paths. | calculate relative paths. | ||||
* The <name> selector supports a new handleDirSep attribute that | |||||
makes it ignore differences between / and \ separators. | |||||
Bugzilla Report 47858. | |||||
Changes from Ant 1.7.0 TO Ant 1.7.1 | Changes from Ant 1.7.0 TO Ant 1.7.1 | ||||
============================================= | ============================================= | ||||
@@ -545,6 +545,16 @@ platforms. | |||||
<td valign="top">Whether name comparisons are case-sensitive</td> | <td valign="top">Whether name comparisons are case-sensitive</td> | ||||
<td align="center" valign="top">No, default <i>true</i></td> | <td align="center" valign="top">No, default <i>true</i></td> | ||||
</tr> | </tr> | ||||
<tr> | |||||
<td valign="top">handledirsep</td> | |||||
<td valign="top"> | |||||
If this is specified, the mapper will treat a \ character in a | |||||
resource name or name attribute as a / for the purposes of | |||||
matching. This attribute can be true or false, the default is | |||||
false. | |||||
<em>Since Ant 1.8.0.</em> | |||||
<td align="center" valign="top">No</td> | |||||
</tr> | |||||
</table> | </table> | ||||
<h4><a name="rsel.exists">exists</a></h4> | <h4><a name="rsel.exists">exists</a></h4> | ||||
@@ -31,6 +31,7 @@ public class Name implements ResourceSelector { | |||||
private String regex = null; | private String regex = null; | ||||
private String pattern; | private String pattern; | ||||
private boolean cs = true; | private boolean cs = true; | ||||
private boolean handleDirSep = false; | |||||
// caches for performance reasons | // caches for performance reasons | ||||
private RegularExpression reg; | private RegularExpression reg; | ||||
@@ -61,6 +62,7 @@ public class Name implements ResourceSelector { | |||||
/** | /** | ||||
* Set the regular expression to compare names against. | * Set the regular expression to compare names against. | ||||
* @param r the regex to set. | * @param r the regex to set. | ||||
* @since Ant 1.8.0 | |||||
*/ | */ | ||||
public void setRegex(String r) { | public void setRegex(String r) { | ||||
regex = r; | regex = r; | ||||
@@ -70,6 +72,7 @@ public class Name implements ResourceSelector { | |||||
/** | /** | ||||
* Get the regular expression used by this Name ResourceSelector. | * Get the regular expression used by this Name ResourceSelector. | ||||
* @return the String selection pattern. | * @return the String selection pattern. | ||||
* @since Ant 1.8.0 | |||||
*/ | */ | ||||
public String getRegex() { | public String getRegex() { | ||||
return regex; | return regex; | ||||
@@ -91,6 +94,26 @@ public class Name implements ResourceSelector { | |||||
return cs; | return cs; | ||||
} | } | ||||
/** | |||||
* Attribute specifing whether to ignore the difference | |||||
* between / and \ (the two common directory characters). | |||||
* @param handleDirSep a boolean, default is false. | |||||
* @since Ant 1.8.0 | |||||
*/ | |||||
public void setHandleDirSep(boolean handleDirSep) { | |||||
this.handleDirSep = handleDirSep; | |||||
} | |||||
/** | |||||
* Whether the difference between / and \ (the two common | |||||
* directory characters) is ignored. | |||||
* | |||||
* @since Ant 1.8.0 | |||||
*/ | |||||
public boolean doesHandledirSep() { | |||||
return handleDirSep; | |||||
} | |||||
/** | /** | ||||
* Return true if this Resource is selected. | * Return true if this Resource is selected. | ||||
* @param r the Resource to check. | * @param r the Resource to check. | ||||
@@ -107,7 +130,7 @@ public class Name implements ResourceSelector { | |||||
private boolean matches(String name) { | private boolean matches(String name) { | ||||
if (pattern != null) { | if (pattern != null) { | ||||
return SelectorUtils.match(pattern, name, cs); | |||||
return SelectorUtils.match(modify(pattern), modify(name), cs); | |||||
} else { | } else { | ||||
if (reg == null) { | if (reg == null) { | ||||
reg = new RegularExpression(); | reg = new RegularExpression(); | ||||
@@ -118,7 +141,14 @@ public class Name implements ResourceSelector { | |||||
if (!cs) { | if (!cs) { | ||||
options |= Regexp.MATCH_CASE_INSENSITIVE; | options |= Regexp.MATCH_CASE_INSENSITIVE; | ||||
} | } | ||||
return expression.matches(name, options); | |||||
return expression.matches(modify(name), options); | |||||
} | |||||
} | |||||
private String modify(String s) { | |||||
if (s == null || !handleDirSep || s.indexOf("\\") == -1) { | |||||
return s; | |||||
} | } | ||||
return s.replace('\\', '/'); | |||||
} | } | ||||
} | } |
@@ -15,8 +15,7 @@ | |||||
See the License for the specific language governing permissions and | See the License for the specific language governing permissions and | ||||
limitations under the License. | limitations under the License. | ||||
--> | --> | ||||
<project xmlns:au="antlib:org.apache.ant.antunit" default="antunit" | |||||
xmlns:rsel="antlib:org.apache.tools.ant.types.resources.selectors"> | |||||
<project xmlns:au="antlib:org.apache.ant.antunit" default="antunit"> | |||||
<import file="../../../antunit-base.xml" /> | <import file="../../../antunit-base.xml" /> | ||||
@@ -32,7 +31,7 @@ | |||||
<resourcecount when="equal" count="1"> | <resourcecount when="equal" count="1"> | ||||
<restrict> | <restrict> | ||||
<fileset dir="${output}"/> | <fileset dir="${output}"/> | ||||
<rsel:name name="*"/> | |||||
<name name="*"/> | |||||
</restrict> | </restrict> | ||||
</resourcecount> | </resourcecount> | ||||
</au:assertTrue> | </au:assertTrue> | ||||
@@ -40,7 +39,7 @@ | |||||
<resourcecount when="equal" count="0"> | <resourcecount when="equal" count="0"> | ||||
<restrict> | <restrict> | ||||
<fileset dir="${output}"/> | <fileset dir="${output}"/> | ||||
<rsel:name name=".*"/> | |||||
<name name=".*"/> | |||||
</restrict> | </restrict> | ||||
</resourcecount> | </resourcecount> | ||||
</au:assertTrue> | </au:assertTrue> | ||||
@@ -51,9 +50,41 @@ | |||||
<resourcecount when="equal" count="1"> | <resourcecount when="equal" count="1"> | ||||
<restrict> | <restrict> | ||||
<fileset dir="${output}"/> | <fileset dir="${output}"/> | ||||
<rsel:name regex=".*"/> | |||||
<name regex=".*"/> | |||||
</restrict> | </restrict> | ||||
</resourcecount> | </resourcecount> | ||||
</au:assertTrue> | </au:assertTrue> | ||||
</target> | </target> | ||||
<target name="testHandledirSep" depends="createTestdir"> | |||||
<au:assertTrue> | |||||
<!-- only one should match the current platform --> | |||||
<resourcecount when="equal" count="1"> | |||||
<resources> | |||||
<restrict> | |||||
<fileset dir="${output}"/> | |||||
<name name="**/${file}"/> | |||||
</restrict> | |||||
<restrict> | |||||
<fileset dir="${output}"/> | |||||
<name name="**\${file}"/> | |||||
</restrict> | |||||
</resources> | |||||
</resourcecount> | |||||
</au:assertTrue> | |||||
<au:assertTrue> | |||||
<resourcecount when="equal" count="2"> | |||||
<resources> | |||||
<restrict> | |||||
<fileset dir="${output}"/> | |||||
<name name="**/${file}" handleDirSep="true"/> | |||||
</restrict> | |||||
<restrict> | |||||
<fileset dir="${output}"/> | |||||
<name name="**\${file}" handleDirSep="true"/> | |||||
</restrict> | |||||
</resources> | |||||
</resourcecount> | |||||
</au:assertTrue> | |||||
</target> | |||||
</project> | </project> |