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;