diff options
author | Jaikiran Pai <jaikiran@apache.org> | 2023-03-02 12:13:41 +0530 |
---|---|---|
committer | Jaikiran Pai <jaikiran@apache.org> | 2023-03-02 12:13:41 +0530 |
commit | 4dbe7a2a600fde2cf4cc525f4985a81f9616fab8 (patch) | |
tree | 0ec002ee6a6bcadc345dcab0405f34b0fc65110e | |
parent | 1200a76e74ccce33da28f322f6574400786780a8 (diff) | |
download | ant-4dbe7a2a600fde2cf4cc525f4985a81f9616fab8.tar.gz |
66468: Fix regexmapper to not swallow backslashes from output
4 files changed, 26 insertions, 3 deletions
@@ -13,6 +13,11 @@ Fixed bugs: basedir. This has now been fixed. Bugzilla Report 66504 + * regexmapper would, in some cases, incorrectly consume backslash characters + from the "to" attribute, resulting in missing backslashes in the output. + This is now fixed. + Bugzilla Report 66468 + Changes from Ant 1.10.12 TO Ant 1.10.13 ======================================= diff --git a/src/etc/testcases/types/mappers/regexpmapper.xml b/src/etc/testcases/types/mappers/regexpmapper.xml index 08f0dedc6..4cca53a96 100644 --- a/src/etc/testcases/types/mappers/regexpmapper.xml +++ b/src/etc/testcases/types/mappers/regexpmapper.xml @@ -29,4 +29,10 @@ <regexpmapper from="d/e/(.*)" to="\1" handledirsep="yes"/> </mapperresult> </target> + + <target name="to-with-backslash-for-non-groups"> + <mapperresult input="a/j.java" output="foo\bar=j.java"> + <regexpmapper from="a/(.*)" to="foo\bar=\1" /> + </mapperresult> + </target> </project> diff --git a/src/main/org/apache/tools/ant/util/RegexpPatternMapper.java b/src/main/org/apache/tools/ant/util/RegexpPatternMapper.java index 144722ab6..ec767f7a7 100644 --- a/src/main/org/apache/tools/ant/util/RegexpPatternMapper.java +++ b/src/main/org/apache/tools/ant/util/RegexpPatternMapper.java @@ -142,12 +142,14 @@ public class RegexpPatternMapper implements FileNameMapper { result.setLength(0); for (int i = 0; i < to.length; i++) { if (to[i] == '\\') { - if (++i < to.length) { - int value = Character.digit(to[i], DECIMAL); + final int nextCharIndex = i + 1; + if (nextCharIndex < to.length) { + int value = Character.digit(to[nextCharIndex], DECIMAL); if (value > -1) { + i++; // mark that the next digit (after the backslash) has been consumed result.append(v.get(value)); } else { - result.append(to[i]); + result.append(to[i]); // append the backslash character } } else { // TODO - should throw an exception instead? diff --git a/src/tests/junit/org/apache/tools/ant/types/mappers/RegexpPatternMapperTest.java b/src/tests/junit/org/apache/tools/ant/types/mappers/RegexpPatternMapperTest.java index 8f95d63d1..9def8bae5 100644 --- a/src/tests/junit/org/apache/tools/ant/types/mappers/RegexpPatternMapperTest.java +++ b/src/tests/junit/org/apache/tools/ant/types/mappers/RegexpPatternMapperTest.java @@ -46,4 +46,14 @@ public class RegexpPatternMapperTest { public void testHandleDirSep() { buildRule.executeTarget("handle.dirsep"); } + + /** + * Test that if the {@code to} attribute of {@code regexpmapper} contains a backslash + * character which isn't followed by a digit (representing regex group) then the backslash + * doesn't disappear from the output. See bug 66468 for details + */ + @Test + public void testBackslashInTo() { + buildRule.executeTarget("to-with-backslash-for-non-groups"); + } } |