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> | ||||