PR: 22759 git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@275176 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -231,6 +231,11 @@ Fixed bugs: | |||
| Other changes: | |||
| -------------- | |||
| * All tasks can be used outside of <target>s. Note that some tasks | |||
| will not work at all outside of targets as they would cause infinite | |||
| loops (<antcall> as well as <ant> and <subant> if they invoke the | |||
| current build file). | |||
| * Six new Clearcase tasks added. | |||
| * A new filter reader namely tokenfilter has been added. Bugzilla | |||
| @@ -258,8 +263,6 @@ Other changes: | |||
| * <input> has a new attribute that allows you to specify a default value. | |||
| * All tasks can be used outside of <target>s | |||
| * Added <image> task (requires JAI). | |||
| * <image> task has now proportions attribute in the <scale/> nested element | |||
| @@ -9,7 +9,12 @@ | |||
| <h2><a name="ant">Ant</a></h2> | |||
| <h3>Description</h3> | |||
| <p>Runs Ant on a supplied buildfile. This can be used to build subprojects.</p> | |||
| <p>Runs Ant on a supplied buildfile. This can be used to build | |||
| subprojects. <strong>This task must no be used outside of a | |||
| <code>target</code> if it invoces the same build file it is part | |||
| of.</strong></p> | |||
| <p>When the <i>antfile</i> attribute is omitted, the file "build.xml" | |||
| in the supplied directory (<i>dir</i> attribute) is used.</p> | |||
| <p>If no target attribute is supplied, the default target of the new project is | |||
| @@ -9,8 +9,11 @@ | |||
| <h2><a name="antcall">AntCall</a></h2> | |||
| <h3>Description</h3> | |||
| <p>Call another target within the same build-file optionally specifying some | |||
| properties (param's in this context)</p> | |||
| <p>Call another target within the same build-file optionally | |||
| specifying some properties (param's in this context). <strong>This | |||
| task must no be used outside of a <code>target</code>.</strong></p> | |||
| <p>By default, all of the properties of the current project will be | |||
| available in the new project. Alternatively, you can | |||
| set the <i>inheritAll</i> attribute to <code>false</code> and only | |||
| @@ -53,6 +53,11 @@ | |||
| <p> | |||
| Calls a given target for all defined sub-builds. This is an extension | |||
| of ant for bulk project execution. | |||
| <strong>This task must no be used outside of a | |||
| <code>target</code> if it invoces the same build file it is | |||
| part of.</strong> | |||
| </p> | |||
| <table border="0" cellspacing="0" cellpadding="2" width="100%"> | |||
| <!-- Subsection heading --> | |||
| @@ -288,7 +288,9 @@ ant.java.version the JVM version Ant detected; currently it can hold | |||
| Ant 1.6 all tasks can be declared outside targets (earlier version | |||
| only allowed <tt><property></tt>,<tt><typedef></tt> and | |||
| <tt><taskdef></tt>). When you do this they are evaluated before | |||
| any targets are executed.</p> | |||
| any targets are executed. Some tasks will generate build failures if | |||
| they are used outside of targets as they may cause infinite loops | |||
| otherwise (<code><antcall></code> for example).</p> | |||
| <p> | |||
| We have given some targets descriptions; this causes the <tt>projecthelp</tt> | |||
| @@ -357,23 +357,33 @@ public class Ant extends Task { | |||
| + " in build file " + antFile.toString(), | |||
| Project.MSG_VERBOSE); | |||
| newProject.setUserProperty("ant.file" , antFile); | |||
| // Are we trying to call the target in which we are defined (or | |||
| // the build file if this is a top level task)? | |||
| if (newProject.getProperty("ant.file") | |||
| .equals(getProject().getProperty("ant.file")) | |||
| && getOwningTarget() != null) { | |||
| if (getOwningTarget().getName().equals("")) { | |||
| if (getTaskName().equals("antcall")) { | |||
| throw new BuildException("antcall must not be used at" | |||
| + " the top level."); | |||
| } else { | |||
| throw new BuildException(getTaskName() + " task at the" | |||
| + " top level must not invoke" | |||
| + " its own build file."); | |||
| } | |||
| } else if (getOwningTarget().getName().equals(target)) { | |||
| throw new BuildException(getTaskName() + " task calling " | |||
| + "its own parent target."); | |||
| } | |||
| } | |||
| ProjectHelper.configureProject(newProject, new File(antFile)); | |||
| if (target == null) { | |||
| target = newProject.getDefaultTarget(); | |||
| } | |||
| // Are we trying to call the target in which we are defined (or | |||
| // the build file if this is a top level task)? | |||
| if (newProject.getBaseDir().equals(getProject().getBaseDir()) | |||
| && newProject.getProperty("ant.file").equals(getProject().getProperty("ant.file")) | |||
| && getOwningTarget() != null | |||
| && (getOwningTarget().getName().equals("") | |||
| || getOwningTarget().getName().equals(target))) { | |||
| throw new BuildException("ant task calling its own parent " | |||
| + "target"); | |||
| } | |||
| addReferences(); | |||
| if (target != null) { | |||
| @@ -431,6 +431,7 @@ public class SubAnt | |||
| private Ant createAntTask(File directory) { | |||
| Ant ant = (Ant) getProject().createTask("ant"); | |||
| ant.setOwningTarget(getOwningTarget()); | |||
| ant.setTaskName(getTaskName()); | |||
| ant.init(); | |||
| if (target != null && target.length() > 0) { | |||
| ant.setTarget(target); | |||
| @@ -0,0 +1,98 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2003 The Apache Software Foundation. All rights | |||
| * reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| * are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by the | |||
| * Apache Software Foundation (http://www.apache.org/)." | |||
| * Alternately, this acknowlegement may appear in the software itself, | |||
| * if and wherever such third-party acknowlegements normally appear. | |||
| * | |||
| * 4. The names "Ant" and "Apache Software | |||
| * Foundation" must not be used to endorse or promote products derived | |||
| * from this software without prior written permission. For written | |||
| * permission, please contact apache@apache.org. | |||
| * | |||
| * 5. Products derived from this software may not be called "Apache" | |||
| * nor may "Apache" appear in their names without prior written | |||
| * permission of the Apache Group. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
| * SUCH DAMAGE. | |||
| * ==================================================================== | |||
| * | |||
| * This software consists of voluntary contributions made by many | |||
| * individuals on behalf of the Apache Software Foundation. For more | |||
| * information on the Apache Software Foundation, please see | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.tools.ant.taskdefs; | |||
| import org.apache.tools.ant.BuildException; | |||
| import org.apache.tools.ant.BuildFileTest; | |||
| /** | |||
| * @since Ant 1.6 | |||
| */ | |||
| public class AntLikeTasksAtTopLevelTest extends BuildFileTest { | |||
| public AntLikeTasksAtTopLevelTest(String name) { | |||
| super(name); | |||
| } | |||
| public void testAnt() { | |||
| try { | |||
| configureProject("src/etc/testcases/taskdefs/toplevelant.xml"); | |||
| fail("no exception thrown"); | |||
| } catch (BuildException e) { | |||
| assertEquals("ant task at the top level must not invoke its own" | |||
| + " build file.", e.getMessage()); | |||
| } | |||
| } | |||
| public void testSubant() { | |||
| try { | |||
| configureProject("src/etc/testcases/taskdefs/toplevelsubant.xml"); | |||
| fail("no exception thrown"); | |||
| } catch (BuildException e) { | |||
| assertEquals("subant task at the top level must not invoke its own" | |||
| + " build file.", e.getMessage()); | |||
| } | |||
| } | |||
| public void testAntcall() { | |||
| try { | |||
| configureProject("src/etc/testcases/taskdefs/toplevelantcall.xml"); | |||
| fail("no exception thrown"); | |||
| } catch (BuildException e) { | |||
| assertEquals("antcall must not be used at the top level.", | |||
| e.getMessage()); | |||
| } | |||
| } | |||
| }// AntLikeTasksAtTopLevelTest | |||