tomcat-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Twiggs, Glenn" <Glenn_Twi...@bmc.com>
Subject PATCH: jakarta-tools/ant/src/main/org/apache/tools/ant/Project.ja va
Date Wed, 24 Nov 1999 21:31:34 GMT
Here is a patch to Project that will suppress multiple executions of the
same target in a build session. It will also prevent circular references
from "crashing" a build. The same target was executing twice when I built
target "all" using the following build.xml:

  <project default="main" ...>
    <target name="main">
      ...
    </target>
    <target name="stuff" depends="main">
      ...
    </target>
    <target name="all" depends="main,stuff"/>
  <project...>

This is what got logged to stdout:

  Executing Target: main
  ...
  Executing Target: main
  ...
  Executing Target: stuff
  ...
  Executing Target: all

The Project.executeTarget(...) method did not know enough to only execute
target "main" once. By adding a vector of visited targets, multiple target
execution (and therefore, circular references) can be suppressed.

This leads to the question: should circular references be suppressed? For
example, the following target declaration is clearly incorrect, but the
patch will allow it to run successfully:

  <target name="main" depends="main"/>

I guess this could be characterized as a partial fix - multiple valid
references to the same target will suppress multiple executions of the
target, but circular references will be silently ignored (except for the
verbose logging message).

Glenn.

Index: ant/src/main/org/apache/tools/ant/Project.java
===================================================================
RCS file:
/home/cvspublic/jakarta-tools/ant/src/main/org/apache/tools/ant/Project.java
,v
retrieving revision 1.12
diff -r1.12 Project.java
64a65
> import java.util.Vector;
98c99,100
<
---
>     private Vector visitedTargets = new Vector();
>
302,303c304,305
<       // make sure any dependencies on this target are executed
<       // first
---
>         // Check to see if the target has already been visited. If so,
assume
>         // it to be up to date and do not execute the target.
305,317c307,310
<       // XXX
<       // note that we aren't catching circular dependencies
<       // right now... The user will get a hell of an error message
<       // so it's not too bad..
<
<       Enumeration enum = target.getDependencies();
<       while (enum.hasMoreElements()) {
<           String dependency = (String)enum.nextElement();
<           Target prereqTarget = (Target)targets.get(dependency);
<           executeTarget(prereqTarget);
<       }
<
<       log("Executing Target: " + target.getName(), MSG_INFO);
---
>         if (!visitedTargets.contains(target)) {
>
>             // make sure any dependencies on this target are executed
>             // first
319c312,331
<       target.execute();
---
>             Enumeration enum = target.getDependencies();
>             while (enum.hasMoreElements()) {
>                 String dependency = (String)enum.nextElement();
>                 Target prereqTarget = (Target)targets.get(dependency);
>                 executeTarget(prereqTarget);
>             }
>
>             log("Executing Target: " + target.getName(), MSG_INFO);
>
>             visitedTargets.addElement(target);
>             target.execute();
>         } else {
>
>             // XXX
>             // note that we aren't catching circular dependencies right
now.
>             // This log message is the only indicator of a circular
dependency.
>
>             log("Skipping previously visited Target: " + target.getName(),
>                 MSG_VERBOSE);
>         }

Mime
View raw message