bodewig     2003/09/04 04:46:03

  Modified:    src/etc/testcases/taskdefs ant.xml
               src/main/org/apache/tools/ant Project.java Target.java
               src/main/org/apache/tools/ant/taskdefs Ant.java
               src/testcases/org/apache/tools/ant/taskdefs AntTest.java
  Log:
  Catch another simple to detect case of infinite antcall loops
  
  Revision  Changes    Path
  1.11      +7 -0      ant/src/etc/testcases/taskdefs/ant.xml
  
  Index: ant.xml
  ===================================================================
  RCS file: /home/cvs/ant/src/etc/testcases/taskdefs/ant.xml,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- ant.xml   12 May 2003 12:57:04 -0000      1.10
  +++ ant.xml   4 Sep 2003 11:46:03 -0000       1.11
  @@ -162,4 +162,11 @@
       <echo>test2 is ${test2}</echo>
       <echo>test1.x is ${test1.x}</echo>
     </target>
  +
  +  <target name="infinite-loop-via-depends">
  +    <antcall target="dependent"/>
  +  </target>
  +
  +  <target name="middleman" depends="infinite-loop-via-depends"/>
  +  <target name="dependent" depends="middleman"/>
   </project>
  
  
  
  1.153     +3 -4      ant/src/main/org/apache/tools/ant/Project.java
  
  Index: Project.java
  ===================================================================
  RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/Project.java,v
  retrieving revision 1.152
  retrieving revision 1.153
  diff -u -r1.152 -r1.153
  --- Project.java      3 Sep 2003 15:22:10 -0000       1.152
  +++ Project.java      4 Sep 2003 11:46:03 -0000       1.153
  @@ -1589,8 +1589,7 @@
        *             Must not be <code>null</code>.
        * @param targets A map of names to targets (String to Target).
        *                Must not be <code>null</code>.
  -     * @return a vector of strings with the names of the targets in
  -     *         sorted order.
  +     * @return a vector of Target objects in sorted order.
        * @exception BuildException if there is a cyclic dependency among the
        *                           targets, or if a named target does not 
exist.
        */
  @@ -2096,4 +2095,4 @@
               // is private/protected.
           }
       }
  -}
  \ No newline at end of file
  +}
  
  
  
  1.44      +16 -0     ant/src/main/org/apache/tools/ant/Target.java
  
  Index: Target.java
  ===================================================================
  RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/Target.java,v
  retrieving revision 1.43
  retrieving revision 1.44
  diff -u -r1.43 -r1.44
  --- Target.java       24 Jul 2003 14:20:56 -0000      1.43
  +++ Target.java       4 Sep 2003 11:46:03 -0000       1.44
  @@ -256,6 +256,22 @@
       }
   
       /**
  +     * Does this target depend on the named target?
  +     *
  +     * @since Ant 1.6
  +     */
  +    public boolean dependsOn(String other) {
  +        if (getProject() != null) {
  +            List l = getProject().topoSort(getName(),
  +                                           getProject().getTargets());
  +            int myIdx = l.indexOf(this);
  +            int otherIdx = l.indexOf(getProject().getTargets().get(other));
  +            return myIdx >= otherIdx;
  +        }
  +        return false;
  +    }
  +
  +    /**
        * Sets the "if" condition to test on execution. This is the
        * name of a property to test for existence - if the property
        * is not set, the task will not execute. The property goes
  
  
  
  1.87      +17 -2     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.86
  retrieving revision 1.87
  diff -u -r1.86 -r1.87
  --- Ant.java  3 Sep 2003 10:03:47 -0000       1.86
  +++ Ant.java  4 Sep 2003 11:46:03 -0000       1.87
  @@ -68,6 +68,7 @@
   import org.apache.tools.ant.Project;
   import org.apache.tools.ant.ProjectComponent;
   import org.apache.tools.ant.ProjectHelper;
  +import org.apache.tools.ant.Target;
   import org.apache.tools.ant.Task;
   import org.apache.tools.ant.types.PropertySet;
   import org.apache.tools.ant.util.FileUtils;
  @@ -363,7 +364,10 @@
               if (newProject.getProperty("ant.file")
                   .equals(getProject().getProperty("ant.file"))
                   && getOwningTarget() != null) {
  -                if (getOwningTarget().getName().equals("")) {
  +
  +                String owningTargetName = getOwningTarget().getName();
  +
  +                if (owningTargetName.equals("")) {
                       if (getTaskName().equals("antcall")) {
                           throw new BuildException("antcall must not be used 
at"
                                                    + " the top level.");
  @@ -372,9 +376,20 @@
                                                    + " top level must not 
invoke"
                                                    + " its own build file.");
                       }
  -                } else if (getOwningTarget().getName().equals(target)) {
  +                } else if (owningTargetName.equals(target)) {
                       throw new BuildException(getTaskName() + " task calling "
                                                + "its own parent target.");
  +                } else {
  +                    Target other = 
  +                        (Target) getProject().getTargets().get(target);
  +                    if (other != null && other.dependsOn(owningTargetName)) {
  +                        throw new BuildException(getTaskName() 
  +                                                 + " task calling a target"
  +                                                 + " that depends on"
  +                                                 + " its parent target \'"
  +                                                 + owningTargetName
  +                                                 + "\'.");
  +                    }
                   }
               }
   
  
  
  
  1.18      +5 -1      
ant/src/testcases/org/apache/tools/ant/taskdefs/AntTest.java
  
  Index: AntTest.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/testcases/org/apache/tools/ant/taskdefs/AntTest.java,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- AntTest.java      12 May 2003 12:57:05 -0000      1.17
  +++ AntTest.java      4 Sep 2003 11:46:03 -0000       1.18
  @@ -302,6 +302,10 @@
           assertTrue(getLog().indexOf("test1.x is 1") > -1);
       }
   
  +    public void testInfiniteLoopViaDepends() {
  +        expectBuildException("infinite-loop-via-depends", "recursive call");
  +    }
  +
       private class BasedirChecker implements BuildListener {
           private String[] expectedBasedirs;
           private int calls = 0;
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to