bodewig 2003/09/03 03:03:47 Modified: . WHATSNEW docs/manual using.html docs/manual/CoreTasks ant.html antcall.html subant.html src/main/org/apache/tools/ant/taskdefs Ant.java SubAnt.java Added: src/testcases/org/apache/tools/ant/taskdefs AntLikeTasksAtTopLevelTest.java Log: Throw an exception instead of looping forever in top-level <*ant*> task. PR: 22759 Revision Changes Path 1.493 +5 -2 ant/WHATSNEW Index: WHATSNEW =================================================================== RCS file: /home/cvs/ant/WHATSNEW,v retrieving revision 1.492 retrieving revision 1.493 diff -u -r1.492 -r1.493 --- WHATSNEW 27 Aug 2003 14:23:17 -0000 1.492 +++ WHATSNEW 3 Sep 2003 10:03:46 -0000 1.493 @@ -231,6 +231,11 @@ 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 @@ -257,8 +262,6 @@ * <filterset> will now resolve filters recursively. * <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). 1.31 +3 -1 ant/docs/manual/using.html Index: using.html =================================================================== RCS file: /home/cvs/ant/docs/manual/using.html,v retrieving revision 1.30 retrieving revision 1.31 diff -u -r1.30 -r1.31 --- using.html 22 Jul 2003 05:52:36 -0000 1.30 +++ using.html 3 Sep 2003 10:03:46 -0000 1.31 @@ -288,7 +288,9 @@ 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> 1.18 +6 -1 ant/docs/manual/CoreTasks/ant.html Index: ant.html =================================================================== RCS file: /home/cvs/ant/docs/manual/CoreTasks/ant.html,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- ant.html 12 May 2003 15:19:18 -0000 1.17 +++ ant.html 3 Sep 2003 10:03:46 -0000 1.18 @@ -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 1.16 +5 -2 ant/docs/manual/CoreTasks/antcall.html Index: antcall.html =================================================================== RCS file: /home/cvs/ant/docs/manual/CoreTasks/antcall.html,v retrieving revision 1.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- antcall.html 12 May 2003 15:19:18 -0000 1.15 +++ antcall.html 3 Sep 2003 10:03:46 -0000 1.16 @@ -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 1.7 +5 -0 ant/docs/manual/CoreTasks/subant.html Index: subant.html =================================================================== RCS file: /home/cvs/ant/docs/manual/CoreTasks/subant.html,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- subant.html 22 May 2003 07:27:50 -0000 1.6 +++ subant.html 3 Sep 2003 10:03:46 -0000 1.7 @@ -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 --> 1.86 +21 -11 ant/src/main/org/apache/tools/ant/taskdefs/Ant.java Index: Ant.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/Ant.java,v retrieving revision 1.85 retrieving revision 1.86 diff -u -r1.85 -r1.86 --- Ant.java 13 Aug 2003 14:46:15 -0000 1.85 +++ Ant.java 3 Sep 2003 10:03:47 -0000 1.86 @@ -357,21 +357,31 @@ + " 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(); 1.9 +1 -0 ant/src/main/org/apache/tools/ant/taskdefs/SubAnt.java Index: SubAnt.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/SubAnt.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- SubAnt.java 16 Jul 2003 14:14:20 -0000 1.8 +++ SubAnt.java 3 Sep 2003 10:03:47 -0000 1.9 @@ -431,6 +431,7 @@ 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); 1.1 ant/src/testcases/org/apache/tools/ant/taskdefs/AntLikeTasksAtTopLevelTest.java Index: AntLikeTasksAtTopLevelTest.java =================================================================== /* * 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 [EMAIL PROTECTED] * * 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
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]