<subant> now supports nested <target> elements as <ant> does. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@420569 13f79535-47bb-0310-9956-ffa450edef68master
@@ -391,10 +391,48 @@ | |||||
</table> | </table> | ||||
<!-- End Element --> | <!-- End Element --> | ||||
<!-- manually written --> | |||||
<!-- Start Element --> | |||||
<table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||||
<tr><td> </td></tr> | |||||
<tr><td bgcolor="#828DA6"> | |||||
<font color="#ffffff" face="arial,helvetica.sanserif" size="-1"> | |||||
<strong>target</strong> (org.apache.tools.ant.taskdefs.Ant.TargetElement)</font> | |||||
</td></tr> | |||||
<tr><td><blockquote> | |||||
You can specify multiple targets using nested <code><target></code> elements | |||||
instead of using the target attribute. These will be executed as if | |||||
Ant had been invoked with a single target whose dependencies are the | |||||
targets so specified, in the order specified. | |||||
<!-- Ignore --> | |||||
<!-- Ignore --> | |||||
<table border="1" cellpadding="2" cellspacing="0"> | |||||
<tr> | |||||
<td valign="top"><b>Attribute</b></td> | |||||
<td valign="top"><b>Description</b></td> | |||||
<td align="center" valign="top"><b>Required</b></td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="top">name</td> | |||||
<td valign="top">The name of the called target.</td> | |||||
<td valign="top" align="center">Yes</td> | |||||
</tr> | |||||
</table> | |||||
<p><em>since Ant 1.7</em>.</p> | |||||
</blockquote></td></tr> | |||||
</table> | |||||
<!-- End Element --> | |||||
<!-- manually written end --> | |||||
</blockquote></td></tr> | </blockquote></td></tr> | ||||
</table> | </table> | ||||
<!-- End Elements --> | <!-- End Elements --> | ||||
<table border="0" cellspacing="0" cellpadding="2" width="100%"> | <table border="0" cellspacing="0" cellpadding="2" width="100%"> | ||||
<tr><td> </td></tr> | <tr><td> </td></tr> | ||||
@@ -408,14 +446,14 @@ | |||||
<tr><td><blockquote> | <tr><td><blockquote> | ||||
<pre> | <pre> | ||||
<project name="subant" default="subant1"> | <project name="subant" default="subant1"> | ||||
<property name="build.dir" value="subant.build"/> | |||||
<target name="subant1"> | |||||
<subant target=""> | |||||
<property name="build.dir" value="subant1.build"/> | |||||
<property name="not.overloaded" value="not.overloaded"/> | |||||
<fileset dir="." includes="*/build.xml"/> | |||||
</subant> | |||||
</target> | |||||
<property name="build.dir" value="subant.build"/> | |||||
<target name="subant1"> | |||||
<subant target=""> | |||||
<property name="build.dir" value="subant1.build"/> | |||||
<property name="not.overloaded" value="not.overloaded"/> | |||||
<fileset dir="." includes="*/build.xml"/> | |||||
</subant> | |||||
</target> | |||||
</project> | </project> | ||||
</pre> | </pre> | ||||
<p> | <p> | ||||
@@ -425,11 +463,11 @@ | |||||
</p> | </p> | ||||
<pre> | <pre> | ||||
<subant target=""> | <subant target=""> | ||||
<propertyset> | |||||
<propertyset> | |||||
<propertyref prefix="toplevel"/> | <propertyref prefix="toplevel"/> | ||||
<mapper type="glob" from="foo*" to="bar*"/> | <mapper type="glob" from="foo*" to="bar*"/> | ||||
</propertyset> | |||||
<fileset dir="." includes="*/build.xml"/> | |||||
</propertyset> | |||||
<fileset dir="." includes="*/build.xml"/> | |||||
</subant> | </subant> | ||||
</pre> | </pre> | ||||
<p> | <p> | ||||
@@ -439,7 +477,7 @@ | |||||
</p> | </p> | ||||
<pre> | <pre> | ||||
<subant target="compile" genericantfile="/opt/project/build1.xml"> | <subant target="compile" genericantfile="/opt/project/build1.xml"> | ||||
<dirset dir="." includes="projects*"/> | |||||
<dirset dir="." includes="projects*"/> | |||||
</subant> | </subant> | ||||
</pre> | </pre> | ||||
<p> | <p> | ||||
@@ -507,6 +545,16 @@ | |||||
the root buildfile is capable to run the whole build over all | the root buildfile is capable to run the whole build over all | ||||
modules. | modules. | ||||
</p> | </p> | ||||
<pre> | |||||
<subant failonerror="false"> | |||||
<fileset dir="." includes="**/build.xml" excludes="build.xml"/> | |||||
<target name="clean"/> | |||||
<target name="build"/> | |||||
</subant> | |||||
</pre> | |||||
<p>Does a "clean build" for each subproject.</p> | |||||
<!-- manually written --> | <!-- manually written --> | ||||
@@ -537,4 +585,4 @@ | |||||
</table> | </table> | ||||
</body> | </body> | ||||
</html> | |||||
</html> |
@@ -5,20 +5,45 @@ | |||||
<subant genericantfile="subant/genericsubant.xml"> | <subant genericantfile="subant/genericsubant.xml"> | ||||
<dirset dir="." includes="subant-test*"/> | <dirset dir="." includes="subant-test*"/> | ||||
</subant> | </subant> | ||||
</target> | </target> | ||||
<target name="testgenericantfile"> | <target name="testgenericantfile"> | ||||
<subant genericantfile="subant/genericsubant.xml"> | <subant genericantfile="subant/genericsubant.xml"> | ||||
<dirset dir="subant" includes="subant-test*"/> | <dirset dir="subant" includes="subant-test*"/> | ||||
</subant> | </subant> | ||||
</target> | </target> | ||||
<target name="testantfile"> | <target name="testantfile"> | ||||
<subant antfile="mysubant.xml"> | <subant antfile="mysubant.xml"> | ||||
<dirset dir="." includes="subant/subant-test*"/> | <dirset dir="." includes="subant/subant-test*"/> | ||||
</subant> | </subant> | ||||
</target> | |||||
<target name="multipleTargets"> | |||||
<subant antfile="mysubant.xml"> | |||||
<dirset dir="." includes="subant/subant-test*"/> | |||||
<target name="one"/> | |||||
<target name="two"/> | |||||
</subant> | |||||
</target> | |||||
<target name="multipleTargetsOneDoesntExist_FOEfalse"> | |||||
<subant antfile="mysubant.xml" failonerror="false"> | |||||
<dirset dir="." includes="subant/subant-test*"/> | |||||
<target name="one"/> | |||||
<target name="three"/> | |||||
</subant> | |||||
</target> | |||||
<target name="multipleTargetsOneDoesntExist_FOEtrue"> | |||||
<subant antfile="mysubant.xml" failonerror="true"> | |||||
<dirset dir="." includes="subant/subant-test*"/> | |||||
<target name="one"/> | |||||
<target name="three"/> | |||||
</subant> | |||||
</target> | </target> | ||||
<target name="cleanup"> | <target name="cleanup"> | ||||
<!-- nothing to do --> | <!-- nothing to do --> | ||||
</target> | </target> | ||||
</project> | |||||
</project> |
@@ -2,4 +2,13 @@ | |||||
<target name="mysubant"> | <target name="mysubant"> | ||||
<echo message="${basedir}"/> | <echo message="${basedir}"/> | ||||
</target> | </target> | ||||
<target name="one"> | |||||
<echo message="test1-one"/> | |||||
</target> | |||||
<target name="two"> | |||||
<echo message="test1-two"/> | |||||
</target> | |||||
<target name="three"> | |||||
<echo message="test1-three"/> | |||||
</target> | |||||
</project> | </project> |
@@ -2,4 +2,10 @@ | |||||
<target name="mysubant"> | <target name="mysubant"> | ||||
<echo message="${basedir}"/> | <echo message="${basedir}"/> | ||||
</target> | </target> | ||||
<target name="one"> | |||||
<echo message="test2-one"/> | |||||
</target> | |||||
<target name="two"> | |||||
<echo message="test2-two"/> | |||||
</target> | |||||
</project> | </project> |
@@ -34,6 +34,8 @@ import org.apache.tools.ant.types.PropertySet; | |||||
import org.apache.tools.ant.types.Reference; | import org.apache.tools.ant.types.Reference; | ||||
import org.apache.tools.ant.types.ResourceCollection; | import org.apache.tools.ant.types.ResourceCollection; | ||||
import org.apache.tools.ant.taskdefs.Ant.TargetElement; | |||||
/** | /** | ||||
* Calls a given target for all defined sub-builds. This is an extension | * Calls a given target for all defined sub-builds. This is an extension | ||||
@@ -76,6 +78,11 @@ public class SubAnt | |||||
private Vector references = new Vector(); | private Vector references = new Vector(); | ||||
private Vector propertySets = new Vector(); | private Vector propertySets = new Vector(); | ||||
/** the targets to call on the new project */ | |||||
private Vector/*<TargetElement>*/ targets = new Vector(); | |||||
/** | /** | ||||
* Pass output sent to System.out to the new project. | * Pass output sent to System.out to the new project. | ||||
* | * | ||||
@@ -274,6 +281,11 @@ public class SubAnt | |||||
ant = createAntTask(directory); | ant = createAntTask(directory); | ||||
String antfilename = file.getAbsolutePath(); | String antfilename = file.getAbsolutePath(); | ||||
ant.setAntfile(antfilename); | ant.setAntfile(antfilename); | ||||
for (int i=0; i<targets.size(); i++) { | |||||
TargetElement targetElement = (TargetElement)targets.get(i); | |||||
ant.addConfiguredTarget(targetElement); | |||||
} | |||||
try { | try { | ||||
ant.execute(); | ant.execute(); | ||||
} catch (BuildException e) { | } catch (BuildException e) { | ||||
@@ -342,6 +354,19 @@ public class SubAnt | |||||
this.subTarget = target; | this.subTarget = target; | ||||
} | } | ||||
/** | |||||
* Add a target to this Ant invocation. | |||||
* @param t the <code>TargetElement</code> to add. | |||||
* @since Ant 1.7 | |||||
*/ | |||||
public void addConfiguredTarget(TargetElement t) { | |||||
String name = t.getName(); | |||||
if ("".equals(name)) { | |||||
throw new BuildException("target name must not be empty"); | |||||
} | |||||
targets.add(t); | |||||
} | |||||
/** | /** | ||||
* Enable/ disable verbose log messages showing when each sub-build path is entered/ exited. | * Enable/ disable verbose log messages showing when each sub-build path is entered/ exited. | ||||
* The default value is "false". | * The default value is "false". | ||||
@@ -580,4 +605,4 @@ public class SubAnt | |||||
} | } | ||||
} | } | ||||
} // END class SubAnt | |||||
} // END class SubAnt |
@@ -25,8 +25,7 @@ import org.apache.tools.ant.BuildEvent; | |||||
import org.apache.tools.ant.BuildFileTest; | import org.apache.tools.ant.BuildFileTest; | ||||
import org.apache.tools.ant.BuildListener; | import org.apache.tools.ant.BuildListener; | ||||
/** | |||||
*/ | |||||
public class SubAntTest extends BuildFileTest { | public class SubAntTest extends BuildFileTest { | ||||
public SubAntTest(String name) { | public SubAntTest(String name) { | ||||
@@ -77,6 +76,25 @@ public class SubAntTest extends BuildFileTest { | |||||
}); | }); | ||||
} | } | ||||
public void testMultipleTargets() { | |||||
executeTarget("multipleTargets"); | |||||
assertLogContaining("test1-one"); | |||||
assertLogContaining("test1-two"); | |||||
assertLogContaining("test2-one"); | |||||
assertLogContaining("test2-two"); | |||||
} | |||||
public void testMultipleTargetsOneDoesntExist_FOEfalse() { | |||||
executeTarget("multipleTargetsOneDoesntExist_FOEfalse"); | |||||
assertLogContaining("Target \"three\" does not exist in the project \"subant\""); | |||||
} | |||||
public void testMultipleTargetsOneDoesntExist_FOEtrue() { | |||||
expectBuildExceptionContaining("multipleTargetsOneDoesntExist_FOEtrue", | |||||
"Calling not existent target", | |||||
"Target \"three\" does not exist in the project \"subant\""); | |||||
} | |||||
protected void testBaseDirs(String target, String[] dirs) { | protected void testBaseDirs(String target, String[] dirs) { | ||||
SubAntTest.BasedirChecker bc = new SubAntTest.BasedirChecker(dirs); | SubAntTest.BasedirChecker bc = new SubAntTest.BasedirChecker(dirs); | ||||
@@ -126,4 +144,4 @@ public class SubAntTest extends BuildFileTest { | |||||
} | } | ||||
} | |||||
} |