diff --git a/src/etc/testcases/taskdefs/ant.topleveltest.xml b/src/etc/testcases/taskdefs/ant.topleveltest.xml new file mode 100644 index 000000000..d61fe5acd --- /dev/null +++ b/src/etc/testcases/taskdefs/ant.topleveltest.xml @@ -0,0 +1,3 @@ + + Hello world + diff --git a/src/etc/testcases/taskdefs/ant.xml b/src/etc/testcases/taskdefs/ant.xml index 5d3ce07d6..a802a755e 100644 --- a/src/etc/testcases/taskdefs/ant.xml +++ b/src/etc/testcases/taskdefs/ant.xml @@ -169,4 +169,20 @@ + + + + + + + + + + prop is ${prop} + + + + + + diff --git a/src/main/org/apache/tools/ant/taskdefs/Ant.java b/src/main/org/apache/tools/ant/taskdefs/Ant.java index bb631c075..c25f5bfbb 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Ant.java +++ b/src/main/org/apache/tools/ant/taskdefs/Ant.java @@ -62,6 +62,8 @@ import java.lang.reflect.Method; import java.util.Enumeration; import java.util.Hashtable; import java.util.Vector; +import java.util.Set; +import java.util.HashSet; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.BuildListener; import org.apache.tools.ant.DefaultLogger; @@ -393,10 +395,10 @@ public class Ant extends Task { throw new BuildException(getTaskName() + " task calling " + "its own parent target."); } else { - Target other = + Target other = (Target) getProject().getTargets().get(target); if (other != null && other.dependsOn(owningTargetName)) { - throw new BuildException(getTaskName() + throw new BuildException(getTaskName() + " task calling a target" + " that depends on" + " its parent target \'" @@ -409,9 +411,9 @@ public class Ant extends Task { addReferences(); if (target != null) { - newProject.executeTarget(target); - } else { - newProject.executeTarget(""); + if (!"".equals(target)) { + newProject.executeTarget(target); + } } } finally { // help the gc @@ -441,6 +443,17 @@ public class Ant extends Task { * @throws BuildException under unknown circumstances */ private void overrideProperties() throws BuildException { + // remove duplicate properties - last property wins + // Needed for backward compatibility + Set set = new HashSet(); + for (int i = properties.size() - 1; i >= 0; --i) { + Property p = (Property) properties.get(i); + if (set.contains(p.getName())) { + properties.remove(i); + } else { + set.add(p.getName()); + } + } Enumeration e = properties.elements(); while (e.hasMoreElements()) { Property p = (Property) e.nextElement(); diff --git a/src/testcases/org/apache/tools/ant/taskdefs/AntTest.java b/src/testcases/org/apache/tools/ant/taskdefs/AntTest.java index 9dc3d1e5a..a3ef00610 100644 --- a/src/testcases/org/apache/tools/ant/taskdefs/AntTest.java +++ b/src/testcases/org/apache/tools/ant/taskdefs/AntTest.java @@ -306,6 +306,14 @@ public class AntTest extends BuildFileTest { expectBuildException("infinite-loop-via-depends", "recursive call"); } + public void testMultiSameProperty() { + expectLog("multi-same-property", "prop is two"); + } + + public void testTopLevelTarget() { + expectLog("topleveltarget", "Hello world"); + } + private class BasedirChecker implements BuildListener { private String[] expectedBasedirs; private int calls = 0;