git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@713016 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -519,6 +519,9 @@ Other changes: | |||
| * <import> has a new attribute "as" that can be used to control the | |||
| prefix prepended to the imported target's names. | |||
| * a new task <include> provides an alternative to <import> that | |||
| should be preferred when you don't want to override any targets. | |||
| Changes from Ant 1.7.0 TO Ant 1.7.1 | |||
| ============================================= | |||
| @@ -27,6 +27,14 @@ | |||
| <p> | |||
| Imports another build file into the current project. | |||
| </p> | |||
| <p> | |||
| <b>Note</b> this task heavily relies on the ProjectHelper | |||
| implementation and doesn't really perform any work of its own. If | |||
| you have configured Ant to use a ProjectHelper other than Ant's | |||
| default, this task may or may not work. | |||
| </p> | |||
| <p> | |||
| On execution it will read another Ant file into | |||
| the same Project. This means that it basically works like the | |||
| @@ -83,7 +91,7 @@ property of the main buildfile.</p> | |||
| <p>Note that "builddocs" is not the filename, but the name attribute | |||
| present in the imported project tag.</p> | |||
| <p> | |||
| If import file does not have a name attribute, the ant.file.projectname | |||
| If the imported file does not have a name attribute, the ant.file.projectname | |||
| property will not be set. | |||
| </p> | |||
| @@ -182,6 +190,89 @@ directory.</p> | |||
| <p>Imports the project defined by the property deploy-platform</p> | |||
| <h3>How is <import> different | |||
| from <a href="include.html"><include></a>?</h3> | |||
| <p>When using import the imported targets are available by up to two | |||
| names. Their "normal" name without any prefix and potentially with | |||
| a prefixed name (the value of the as attribute or the imported | |||
| project's name attribute, if any).</p> | |||
| <p>When using include the included targets are only available in the | |||
| prefixed form.</p> | |||
| <p>When using import, the imported target's depends attribute | |||
| remains unchanged, i.e. it uses "normal" names and allows you to | |||
| override targets in the dependency list.</p> | |||
| <p>When using include, the included target's depends attribute is | |||
| rewritten so that prefixed names are used. This allows writers of | |||
| the included file to control which target is invoked as part of the | |||
| dependencies.</p> | |||
| <p>It is possible to include the same file more than once by using | |||
| different prefixes, it is not possible to import the same file more | |||
| than once.</p> | |||
| <p>Use import if you intend to override a target, otherwise use include.</p> | |||
| <p><i>nested.xml</i> shall be:</p> | |||
| <pre> | |||
| <project> | |||
| <target name="setUp"> | |||
| <property name="prop" value="in nested"/> | |||
| </target> | |||
| <target name="echo" depends="setUp"> | |||
| <echo>prop has the value ${prop}</echo> | |||
| </target> | |||
| </project> | |||
| </pre> | |||
| <p>When using import like in</p> | |||
| <pre> | |||
| <project> | |||
| <target name="setUp"> | |||
| <property name="prop" value="in importing"/> | |||
| </target> | |||
| <import file="nested.xml" as="nested"/> | |||
| </project> | |||
| </pre> | |||
| <p>Running the target <i>nested.echo</i> will emit: | |||
| <pre> | |||
| setUp: | |||
| nested.echo: | |||
| [echo] prop has the value in importing | |||
| </pre> | |||
| <p>When using include like in</p> | |||
| <pre> | |||
| <project> | |||
| <target name="setUp"> | |||
| <property name="prop" value="in importing"/> | |||
| </target> | |||
| <include file="nested.xml" as="nested"/> | |||
| </project> | |||
| </pre> | |||
| <p>Running the target <i>nested.echo</i> will emit: | |||
| <pre> | |||
| nested.setUp: | |||
| nested.echo: | |||
| [echo] prop has the value in nested | |||
| </pre> | |||
| <p>and there won't be any target named "echo" on the including build file.</p> | |||
| </body> | |||
| </html> | |||
| @@ -0,0 +1,274 @@ | |||
| <!-- | |||
| Licensed to the Apache Software Foundation (ASF) under one or more | |||
| contributor license agreements. See the NOTICE file distributed with | |||
| this work for additional information regarding copyright ownership. | |||
| The ASF licenses this file to You under the Apache License, Version 2.0 | |||
| (the "License"); you may not use this file except in compliance with | |||
| the License. You may obtain a copy of the License at | |||
| http://www.apache.org/licenses/LICENSE-2.0 | |||
| Unless required by applicable law or agreed to in writing, software | |||
| distributed under the License is distributed on an "AS IS" BASIS, | |||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| See the License for the specific language governing permissions and | |||
| limitations under the License. | |||
| --> | |||
| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> | |||
| <html> | |||
| <head> | |||
| <meta http-equiv="Content-Language" content="en-us"> | |||
| <link rel="stylesheet" type="text/css" href="../stylesheets/style.css"> | |||
| <title>Include Task</title> | |||
| </head> | |||
| <body> | |||
| <h2><a name="include">Include</a></h2> | |||
| <h3>Description</h3> | |||
| <p> | |||
| Include another build file into the current project. | |||
| </p> | |||
| <p> | |||
| <b>Note</b> this task heavily relies on the ProjectHelper | |||
| implementation and doesn't really perform any work of its own. If | |||
| you have configured Ant to use a ProjectHelper other than Ant's | |||
| default, this task may or may not work. | |||
| </p> | |||
| <p> | |||
| On execution it will read another Ant file into the same Project | |||
| rewriting the included target names and depends lists. This is | |||
| different | |||
| from <a href="http://ant.apache.org/faq.html#xml-entity-include">Entity | |||
| Includes as explained in the Ant FAQ</a> in so far as the target | |||
| names get prefixed by the included project's name or the as | |||
| attribute and do not appear as if the file was contained in the | |||
| including file. | |||
| </p> | |||
| <p> | |||
| The include task may only be used as a top-level task. This means that | |||
| it may not be used in a target. | |||
| </p> | |||
| <p> | |||
| There are two further functional aspects that pertain to this task and | |||
| that are not possible with entity includes: | |||
| <ul> | |||
| <li>target rewriting</li> | |||
| <li>special properties</li> | |||
| </ul> | |||
| </p> | |||
| <h4>Target rewriting</h4> | |||
| <p>Any target in the included file will be renamed | |||
| to <i>prefix.name</i> where <i>name</i> is the original target's | |||
| name and <i>prefix</i> is either the value of the <i>as</i> | |||
| attribute or the <i>name</i> attribute of the <i>project</i> tag of | |||
| the included file.</p> | |||
| <p>The depends attribute of all included targets is rewritten so that | |||
| all target names are prefixed as well. This makes the included file | |||
| self-contained.</p> | |||
| <h4>Special Properties</h4> | |||
| <p>Included files are treated as they are present in the main | |||
| buildfile. This makes it easy to understand, but it makes it impossible | |||
| for them to reference files and resources relative to their path. | |||
| Because of this, for every included file, Ant adds a property that | |||
| contains the path to the included buildfile. With this path, the | |||
| included buildfile can keep resources and be able to reference them | |||
| relative to its position.</p> | |||
| <p>So if I include for example a <i>docsbuild.xml</i> file named <b>builddocs</b>, | |||
| I can get its path as <b>ant.file.builddocs</b>, similarly to the <b>ant.file</b> | |||
| property of the main buildfile.</p> | |||
| <p>Note that "builddocs" is not the filename, but the name attribute | |||
| present in the included project tag.</p> | |||
| <p> | |||
| If the included file does not have a name attribute, the ant.file.projectname | |||
| property will not be set. | |||
| </p> | |||
| <h4>Resolving files against the included file</h4> | |||
| <p>Suppose your main build file called <code>including.xml</code> | |||
| includes a build file <code>included.xml</code>, located anywhere on | |||
| the file system, and <code>included.xml</code> reads a set of | |||
| properties from <code>included.properties</code>:</p> | |||
| <pre><!-- including.xml --> | |||
| <project name="including" basedir="." default="..."> | |||
| <include file="${path_to_included}/included.xml"/> | |||
| </project> | |||
| <!-- included.xml --> | |||
| <project name="included" basedir="." default="..."> | |||
| <property file="included.properties"/> | |||
| </project> | |||
| </pre> | |||
| <p>This snippet however will resolve <code>included.properties</code> | |||
| against the basedir of <code>including.xml</code>, because the basedir | |||
| of <code>included.xml</code> is ignored by Ant. The right way to use | |||
| <code>included.properties</code> is:</p> | |||
| <pre> | |||
| <!-- included.xml --> | |||
| <project name="included" basedir="." default="..."> | |||
| <dirname property="included.basedir" file="${ant.file.included}"/> | |||
| <property file="${included.basedir}/included.properties"/> | |||
| </project> | |||
| </pre> | |||
| <p>As explained above <code>${ant.file.included}</code> stores the | |||
| path of the build script, that defines the project called | |||
| <code>included</code>, (in short it stores the path to | |||
| <code>included.xml</code>) and <a | |||
| href="dirname.html"><code><dirname></code></a> takes its | |||
| directory. This technique also allows <code>included.xml</code> to be | |||
| used as a standalone file (without being included in other | |||
| project).</p> | |||
| <h3>Parameters</h3> | |||
| <table border="1" cellpadding="2" cellspacing="0"> | |||
| <tbody> | |||
| <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"> | |||
| file | |||
| </td> | |||
| <td valign="top"> | |||
| The file to include. If this is a relative file name, the file name will be resolved | |||
| relative to the <i>including</i> file. <b>Note</b>, this is unlike most other | |||
| ant file attributes, where relative files are resolved relative to ${basedir}. | |||
| </td> | |||
| <td valign="top" align="center">Yes</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top"> | |||
| optional | |||
| </td> | |||
| <td valign="top"> | |||
| If true, do not stop the build if the file does not exist, | |||
| default is false. | |||
| </td> | |||
| <td valign="top" align="center">No</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top"> | |||
| as | |||
| </td> | |||
| <td valign="top"> | |||
| Specifies the prefix prepended to the target names. If | |||
| ommitted, the name attribute of the project tag of the | |||
| imported file will be used. | |||
| </td> | |||
| <td valign="top" align="center">Yes, if the included file's | |||
| project tag doesn't specify a name attribute.</td> | |||
| </tr> | |||
| </tbody> | |||
| </table> | |||
| <h3>Examples</h3> | |||
| <pre> <include file="../common-targets.xml"/> | |||
| </pre> | |||
| <p>Includes targets from the common-targets.xml file that is in a parent | |||
| directory.</p> | |||
| <pre> <include file="${deploy-platform}.xml"/> | |||
| </pre> | |||
| <p>Includes the project defined by the property deploy-platform</p> | |||
| <h3>How is <a href="import.html"><import></a> different | |||
| from <include>?</h3> | |||
| <p>When using import the imported targets are available by up to two | |||
| names. Their "normal" name without any prefix and potentially with | |||
| a prefixed name (the value of the as attribute or the imported | |||
| project's name attribute, if any).</p> | |||
| <p>When using include the included targets are only available in the | |||
| prefixed form.</p> | |||
| <p>When using import, the imported target's depends attribute | |||
| remains unchanged, i.e. it uses "normal" names and allows you to | |||
| override targets in the dependency list.</p> | |||
| <p>When using include, the included target's depends attribute is | |||
| rewritten so that prefixed names are used. This allows writers of | |||
| the included file to control which target is invoked as part of the | |||
| dependencies.</p> | |||
| <p>It is possible to include the same file more than once by using | |||
| different prefixes, it is not possible to import the same file more | |||
| than once.</p> | |||
| <p>Use import if you intend to override a target, otherwise use include.</p> | |||
| <p><i>nested.xml</i> shall be:</p> | |||
| <pre> | |||
| <project> | |||
| <target name="setUp"> | |||
| <property name="prop" value="in nested"/> | |||
| </target> | |||
| <target name="echo" depends="setUp"> | |||
| <echo>prop has the value ${prop}</echo> | |||
| </target> | |||
| </project> | |||
| </pre> | |||
| <p>When using import like in</p> | |||
| <pre> | |||
| <project> | |||
| <target name="setUp"> | |||
| <property name="prop" value="in importing"/> | |||
| </target> | |||
| <import file="nested.xml" as="nested"/> | |||
| </project> | |||
| </pre> | |||
| <p>Running the target <i>nested.echo</i> will emit: | |||
| <pre> | |||
| setUp: | |||
| nested.echo: | |||
| [echo] prop has the value in importing | |||
| </pre> | |||
| <p>When using include like in</p> | |||
| <pre> | |||
| <project> | |||
| <target name="setUp"> | |||
| <property name="prop" value="in importing"/> | |||
| </target> | |||
| <include file="nested.xml" as="nested"/> | |||
| </project> | |||
| </pre> | |||
| <p>Running the target <i>nested.echo</i> will emit: | |||
| <pre> | |||
| nested.setUp: | |||
| nested.echo: | |||
| [echo] prop has the value in nested | |||
| </pre> | |||
| <p>and there won't be any target named "echo" on the including build file.</p> | |||
| </body> | |||
| </html> | |||
| @@ -77,6 +77,7 @@ | |||
| <a href="CoreTasks/unpack.html">GUnzip</a><br/> | |||
| <a href="CoreTasks/pack.html">GZip</a><br/> | |||
| <a href="CoreTasks/import.html">Import</a><br/> | |||
| <a href="CoreTasks/include.html">Include</a><br/> | |||
| <a href="CoreTasks/input.html">Input</a><br/> | |||
| <a href="CoreTasks/jar.html">Jar</a><br/> | |||
| <a href="CoreTasks/java.html">Java</a><br/> | |||
| @@ -843,6 +843,11 @@ documentation.</p> | |||
| in it with targets of your own.</p></td> | |||
| </tr> | |||
| <tr valign="top"> | |||
| <td nowrap><a href="CoreTasks/include.html">Include</a></td> | |||
| <td><p>Include another build file.</p></td> | |||
| </tr> | |||
| <tr valign="top"> | |||
| <td nowrap><a href="OptionalTasks/javacc.html">JavaCC</a></td> | |||
| <td><p>Invokes the | |||
| @@ -128,7 +128,7 @@ public class ProjectHelper { | |||
| * | |||
| * @return the configured prefix or null | |||
| * | |||
| * @since ant 1.8.0 | |||
| * @since Ant 1.8.0 | |||
| */ | |||
| public static String getCurrentTargetPrefix() { | |||
| return (String) targetPrefix.get(); | |||
| @@ -137,12 +137,47 @@ public class ProjectHelper { | |||
| /** | |||
| * Sets the prefix to prepend to imported target names. | |||
| * | |||
| * @since ant 1.8.0 | |||
| * @since Ant 1.8.0 | |||
| */ | |||
| public static void setCurrentTargetPrefix(String prefix) { | |||
| targetPrefix.set(prefix); | |||
| } | |||
| private final static ThreadLocal inIncludeMode = new ThreadLocal() { | |||
| protected Object initialValue() { | |||
| return Boolean.FALSE; | |||
| } | |||
| }; | |||
| /** | |||
| * Whether the current file should be read in include as opposed | |||
| * to import mode. | |||
| * | |||
| * <p>In include mode included targets are only known by their | |||
| * prefixed names and their depends lists get rewritten so that | |||
| * all dependencies get the prefix as well.</p> | |||
| * | |||
| * <p>In import mode imported targets are known by an adorned as | |||
| * well as a prefixed name and the unadorned target may be | |||
| * overwritten in the importing build file. The depends list of | |||
| * the imported targets is not modified at all.</p> | |||
| * | |||
| * @since Ant 1.8.0 | |||
| */ | |||
| public static boolean isInIncludeMode() { | |||
| return inIncludeMode.get() == Boolean.TRUE; | |||
| } | |||
| /** | |||
| * Sets whether the current file should be read in include as | |||
| * opposed to import mode. | |||
| * | |||
| * @since Ant 1.8.0 | |||
| */ | |||
| public static void setInIncludeMode(boolean includeMode) { | |||
| inIncludeMode.set(includeMode ? Boolean.TRUE : Boolean.FALSE); | |||
| } | |||
| // -------------------- Parse method -------------------- | |||
| /** | |||
| * Parses the project file, configuring the project as it goes. | |||
| @@ -125,19 +125,31 @@ public class Target implements TaskContainer { | |||
| * depends on. Must not be <code>null</code>. | |||
| */ | |||
| public void setDepends(String depS) { | |||
| if (depS.length() > 0) { | |||
| for (Iterator iter = parseDepends(depS, getName()).iterator(); | |||
| iter.hasNext(); ) { | |||
| addDependency((String) iter.next()); | |||
| } | |||
| } | |||
| public static List/*<String>*/ parseDepends(String depends, | |||
| String targetName) { | |||
| ArrayList list = new ArrayList(); | |||
| if (depends.length() > 0) { | |||
| StringTokenizer tok = | |||
| new StringTokenizer(depS, ",", true); | |||
| new StringTokenizer(depends, ",", true); | |||
| while (tok.hasMoreTokens()) { | |||
| String token = tok.nextToken().trim(); | |||
| // Make sure the dependency is not empty string | |||
| if ("".equals(token) || ",".equals(token)) { | |||
| throw new BuildException("Syntax Error: depends " + "attribute of target \"" | |||
| + getName() + "\" has an empty string as dependency."); | |||
| throw new BuildException("Syntax Error: depends " | |||
| + "attribute of target \"" | |||
| + targetName | |||
| + "\" has an empty string as " | |||
| + "dependency."); | |||
| } | |||
| addDependency(token); | |||
| list.add(token); | |||
| // Make sure that depends attribute does not | |||
| // end in a , | |||
| @@ -145,12 +157,15 @@ public class Target implements TaskContainer { | |||
| token = tok.nextToken(); | |||
| if (!tok.hasMoreTokens() || !",".equals(token)) { | |||
| throw new BuildException("Syntax Error: Depend " | |||
| + "attribute for target \"" + getName() | |||
| + "\" ends with a , character"); | |||
| + "attribute for target \"" | |||
| + targetName | |||
| + "\" ends with a \",\" " | |||
| + "character"); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| return list; | |||
| } | |||
| /** | |||
| @@ -45,6 +45,7 @@ import java.io.UnsupportedEncodingException; | |||
| import java.net.URL; | |||
| import java.util.HashMap; | |||
| import java.util.Hashtable; | |||
| import java.util.Iterator; | |||
| import java.util.Map; | |||
| import java.util.Stack; | |||
| @@ -845,9 +846,25 @@ public class ProjectHelper2 extends ProjectHelper { | |||
| context.getLocator()); | |||
| } | |||
| String prefix = null; | |||
| boolean isInIncludeMode = | |||
| context.isIgnoringProjectTag() && isInIncludeMode(); | |||
| if (isInIncludeMode) { | |||
| prefix = getTargetPrefix(context); | |||
| if (prefix == null) { | |||
| throw new BuildException("can't include build file " | |||
| + context.getBuildFile() | |||
| + ", no as attribute has been given" | |||
| + " and the project tag doesn't" | |||
| + " specify a name attribute"); | |||
| } | |||
| name = prefix + "." + name; | |||
| } | |||
| // Check if this target is in the current build file | |||
| if (context.getCurrentTargets().get(name) != null) { | |||
| throw new BuildException("Duplicate target '" + name + "'", target.getLocation()); | |||
| throw new BuildException("Duplicate target '" + name + "'", | |||
| target.getLocation()); | |||
| } | |||
| Hashtable projectTargets = project.getTargets(); | |||
| boolean usedTarget = false; | |||
| @@ -862,12 +879,19 @@ public class ProjectHelper2 extends ProjectHelper { | |||
| usedTarget = true; | |||
| } | |||
| if (depends.length() > 0) { | |||
| target.setDepends(depends); | |||
| if (!isInIncludeMode) { | |||
| target.setDepends(depends); | |||
| } else { | |||
| for (Iterator iter = | |||
| Target.parseDepends(depends, name).iterator(); | |||
| iter.hasNext(); ) { | |||
| target.addDependency(prefix + "." + iter.next()); | |||
| } | |||
| } | |||
| } | |||
| String prefix = null; | |||
| if (context.isIgnoringProjectTag() | |||
| if (!isInIncludeMode && context.isIgnoringProjectTag() | |||
| && (prefix = getTargetPrefix(context)) != null) { | |||
| // In an impored file (and not completely | |||
| // In an imported file (and not completely | |||
| // ignoring the project tag or having a preconfigured prefix) | |||
| String newName = prefix + "." + name; | |||
| Target newTarget = usedTarget ? new Target(target) : target; | |||
| @@ -145,7 +145,7 @@ public class ImportTask extends Task { | |||
| } | |||
| } | |||
| if (importStack.contains(importedFile)) { | |||
| if (!isInIncludeMode() && importStack.contains(importedFile)) { | |||
| getProject().log( | |||
| "Skipped already imported file:\n " | |||
| + importedFile + "\n", Project.MSG_VERBOSE); | |||
| @@ -155,14 +155,36 @@ public class ImportTask extends Task { | |||
| // nested invokations are possible like an imported file | |||
| // importing another one | |||
| String oldPrefix = ProjectHelper.getCurrentTargetPrefix(); | |||
| boolean oldIncludeMode = ProjectHelper.isInIncludeMode(); | |||
| try { | |||
| ProjectHelper.setCurrentTargetPrefix(targetPrefix); | |||
| ProjectHelper.setInIncludeMode(isInIncludeMode()); | |||
| helper.parse(getProject(), importedFile); | |||
| } catch (BuildException ex) { | |||
| throw ProjectHelper.addLocationToBuildException( | |||
| ex, getLocation()); | |||
| } finally { | |||
| ProjectHelper.setCurrentTargetPrefix(oldPrefix); | |||
| ProjectHelper.setInIncludeMode(oldIncludeMode); | |||
| } | |||
| } | |||
| /** | |||
| * Whether the task is in include (as opposed to import) mode. | |||
| * | |||
| * <p>In include mode included targets are only known by their | |||
| * prefixed names and their depends lists get rewritten so that | |||
| * all dependencies get the prefix as well.</p> | |||
| * | |||
| * <p>In import mode imported targets are known by an adorned as | |||
| * well as a prefixed name and the unadorned target may be | |||
| * overwritten in the importing build file. The depends list of | |||
| * the imported targets is not modified at all.</p> | |||
| * | |||
| * @since Ant 1.8.0 | |||
| */ | |||
| protected final boolean isInIncludeMode() { | |||
| return "include".equals(getTaskType()); | |||
| } | |||
| } | |||
| @@ -56,6 +56,7 @@ get=org.apache.tools.ant.taskdefs.Get | |||
| gunzip=org.apache.tools.ant.taskdefs.GUnzip | |||
| gzip=org.apache.tools.ant.taskdefs.GZip | |||
| import=org.apache.tools.ant.taskdefs.ImportTask | |||
| include=org.apache.tools.ant.taskdefs.ImportTask | |||
| input=org.apache.tools.ant.taskdefs.Input | |||
| jar=org.apache.tools.ant.taskdefs.Jar | |||
| java=org.apache.tools.ant.taskdefs.Java | |||
| @@ -28,4 +28,22 @@ | |||
| <target name="testExplicitPrefix" depends="c.b"> | |||
| <au:assertEquals expected="baz" actual="${foo}"/> | |||
| </target> | |||
| <target name="testNoExplicitPrefixUsedWithoutPrefix" depends="a"> | |||
| <au:assertEquals expected="bar" actual="${foo}"/> | |||
| </target> | |||
| <target name="testExplicitPrefixUsedWithoutPrefix" depends="b"> | |||
| <au:assertEquals expected="baz" actual="${foo}"/> | |||
| </target> | |||
| <import file="importtests/override.xml"/> | |||
| <target name="setProperty"> | |||
| <property name="prop" value="in including/importing"/> | |||
| </target> | |||
| <target name="testOverride" depends="override.dummy"> | |||
| <au:assertEquals expected="in including/importing" actual="${prop}"/> | |||
| </target> | |||
| </project> | |||
| @@ -0,0 +1,25 @@ | |||
| <?xml version="1.0"?> | |||
| <!-- | |||
| Licensed to the Apache Software Foundation (ASF) under one or more | |||
| contributor license agreements. See the NOTICE file distributed with | |||
| this work for additional information regarding copyright ownership. | |||
| The ASF licenses this file to You under the Apache License, Version 2.0 | |||
| (the "License"); you may not use this file except in compliance with | |||
| the License. You may obtain a copy of the License at | |||
| http://www.apache.org/licenses/LICENSE-2.0 | |||
| Unless required by applicable law or agreed to in writing, software | |||
| distributed under the License is distributed on an "AS IS" BASIS, | |||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| See the License for the specific language governing permissions and | |||
| limitations under the License. | |||
| --> | |||
| <project name="override"> | |||
| <target name="setProperty"> | |||
| <property name="prop" value="in included/imported"/> | |||
| </target> | |||
| <target name="dummy" depends="setProperty"/> | |||
| </project> | |||
| @@ -0,0 +1,41 @@ | |||
| <?xml version="1.0"?> | |||
| <!-- | |||
| Licensed to the Apache Software Foundation (ASF) under one or more | |||
| contributor license agreements. See the NOTICE file distributed with | |||
| this work for additional information regarding copyright ownership. | |||
| The ASF licenses this file to You under the Apache License, Version 2.0 | |||
| (the "License"); you may not use this file except in compliance with | |||
| the License. You may obtain a copy of the License at | |||
| http://www.apache.org/licenses/LICENSE-2.0 | |||
| Unless required by applicable law or agreed to in writing, software | |||
| distributed under the License is distributed on an "AS IS" BASIS, | |||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| See the License for the specific language governing permissions and | |||
| limitations under the License. | |||
| --> | |||
| <project default="antunit" xmlns:au="antlib:org.apache.ant.antunit"> | |||
| <import file="../antunit-base.xml" /> | |||
| <include file="importtests/a.xml"/> | |||
| <include file="importtests/b.xml" as="c"/> | |||
| <target name="testNoExplicitPrefix" depends="a.a"> | |||
| <au:assertEquals expected="bar" actual="${foo}"/> | |||
| </target> | |||
| <target name="testExplicitPrefix" depends="c.b"> | |||
| <au:assertEquals expected="baz" actual="${foo}"/> | |||
| </target> | |||
| <include file="importtests/override.xml"/> | |||
| <target name="setProperty"> | |||
| <property name="prop" value="in including/importing"/> | |||
| </target> | |||
| <target name="testNoOverride" depends="override.dummy"> | |||
| <au:assertEquals expected="in included/imported" actual="${prop}"/> | |||
| </target> | |||
| </project> | |||