mbenson 2004/07/23 13:16:29 Modified: 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 CallTargetTest.java src/etc/testcases/taskdefs ant.xml calltarget.xml Log: Try to get the dependency analysis right this time while preserving BC. PR: 29977 Revision Changes Path 1.172 +49 -18 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.171 retrieving revision 1.172 diff -u -r1.171 -r1.172 --- Project.java 17 Jul 2004 16:31:40 -0000 1.171 +++ Project.java 23 Jul 2004 20:16:29 -0000 1.172 @@ -1181,14 +1181,11 @@ throw new BuildException(msg); } - // Sort the dependency tree, and run everything from the - // beginning until we hit our targetName. + // Sort and run the dependency tree. // Sorting checks if all the targets (and dependencies) // exist, and if there is any cycle in the dependency // graph. - Vector sortedTargets = topoSort(targetName, targets); - sortedTargets.setSize(sortedTargets.indexOf(targets.get(targetName)) + 1); - executeSortedTargets(sortedTargets); + executeSortedTargets(topoSort(targetName, targets, false)); } /** @@ -1557,38 +1554,65 @@ } /** - * Topologically sorts a set of targets. + * Topologically sorts a set of targets. Equivalent to calling + * <CODE>topoSort(new String[] {root}, targets, true)</CODE>. * * @param root The name of the root target. The sort is created in such * a way that the sequence of Targets up to the root * target is the minimum possible such sequence. * Must not be <code>null</code>. - * @param targets A map of names to targets (String to Target). + * @param targets A Hashtable mapping names to Targets. * Must not be <code>null</code>. - * @return a vector of Target objects in sorted order. + * @return a Vector of ALL Target objects in sorted order. * @exception BuildException if there is a cyclic dependency among the * targets, or if a named target does not exist. */ public final Vector topoSort(String root, Hashtable targets) throws BuildException { - return topoSort(new String[] {root}, targets); + return topoSort(new String[] {root}, targets, true); + } + + /** + * Topologically sorts a set of targets. Equivalent to calling + * <CODE>topoSort(new String[] {root}, targets, returnAll)</CODE>. + * + * @param root The name of the root target. The sort is created in such + * a way that the sequence of Targets up to the root + * target is the minimum possible such sequence. + * Must not be <code>null</code>. + * @param targets A Hashtable mapping names to Targets. + * Must not be <code>null</code>. + * @param returnAll <CODE>boolean</CODE> indicating whether to return all + * targets, or the execution sequence only. + * @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. + * @since Ant 1.6.3 + */ + public final Vector topoSort(String root, Hashtable targets, + boolean returnAll) throws BuildException { + return topoSort(new String[] {root}, targets, returnAll); } /** * Topologically sorts a set of targets. * * @param root <CODE>String[]</CODE> containing the names of the root targets. - * The sort is created in such a way that the sequence of Targets - * up to the root target is the minimum possible such sequence. + * The sort is created in such a way that the ordered sequence of + * Targets is the minimum possible such sequence to the specified + * root targets. * 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 Target objects in sorted order. + * @param returnAll <CODE>boolean</CODE> indicating whether to return all + * targets, or the execution sequence only. + * @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. + * @since Ant 1.6.3 */ - public final Vector topoSort(String[] root, Hashtable targets) - throws BuildException { + public final Vector topoSort(String[] root, Hashtable targets, + boolean returnAll) throws BuildException { Vector ret = new Vector(); Hashtable state = new Hashtable(); Stack visiting = new Stack(); @@ -1602,7 +1626,13 @@ // build Target. for (int i = 0; i < root.length; i++) { - tsort(root[i], targets, state, visiting, ret); + String st = (String)(state.get(root[i])); + if (st == null) { + tsort(root[i], targets, state, visiting, ret); + } else if (st == VISITING) { + throw new RuntimeException("Unexpected node in visiting state: " + + root[i]); + } } StringBuffer buf = new StringBuffer("Build sequence for target(s)"); @@ -1612,17 +1642,18 @@ buf.append(" is " + ret); log(buf.toString(), MSG_VERBOSE); + Vector complete = (returnAll) ? ret : new Vector(ret); for (Enumeration en = targets.keys(); en.hasMoreElements();) { String curTarget = (String) en.nextElement(); String st = (String) state.get(curTarget); if (st == null) { - tsort(curTarget, targets, state, visiting, ret); + tsort(curTarget, targets, state, visiting, complete); } else if (st == VISITING) { throw new RuntimeException("Unexpected node in visiting state: " + curTarget); } } - log("Complete build sequence is " + ret, MSG_VERBOSE); + log("Complete build sequence is " + complete, MSG_VERBOSE); return ret; } 1.55 +3 -8 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.54 retrieving revision 1.55 diff -u -r1.54 -r1.55 --- Target.java 10 Jun 2004 08:15:01 -0000 1.54 +++ Target.java 23 Jul 2004 20:16:29 -0000 1.55 @@ -219,14 +219,9 @@ * @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; + Project p = getProject(); + Hashtable t = (p == null) ? null : p.getTargets(); + return (p != null && p.topoSort(getName(), t, false).contains(t.get(other))); } /** 1.105 +2 -5 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.104 retrieving revision 1.105 diff -u -r1.104 -r1.105 --- Ant.java 24 Jun 2004 19:30:03 -0000 1.104 +++ Ant.java 23 Jul 2004 20:16:29 -0000 1.105 @@ -397,12 +397,9 @@ String[] nameArray = (String[])(locals.toArray(new String[locals.size()])); - Hashtable targets = newProject.getTargets(); - Vector sortedTargets = newProject.topoSort(nameArray, targets); + newProject.executeSortedTargets(newProject.topoSort( + nameArray, newProject.getTargets(), false)); - sortedTargets.setSize(sortedTargets.indexOf(targets.get( - locals.lastElement())) + 1); - newProject.executeSortedTargets(sortedTargets); } catch (BuildException ex) { t = ProjectHelper .addLocationToBuildException(ex, getLocation()); 1.27 +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.26 retrieving revision 1.27 diff -u -r1.26 -r1.27 --- AntTest.java 24 Jun 2004 19:30:03 -0000 1.26 +++ AntTest.java 23 Jul 2004 20:16:29 -0000 1.27 @@ -303,6 +303,10 @@ expectLog("multiple-targets", "tadadctbdbtc"); } + public void testMultipleTargets2() { + expectLog("multiple-targets-2", "dadctb"); + } + private class BasedirChecker implements BuildListener { private String[] expectedBasedirs; private int calls = 0; 1.9 +4 -0 ant/src/testcases/org/apache/tools/ant/taskdefs/CallTargetTest.java Index: CallTargetTest.java =================================================================== RCS file: /home/cvs/ant/src/testcases/org/apache/tools/ant/taskdefs/CallTargetTest.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- CallTargetTest.java 24 Jun 2004 19:30:03 -0000 1.8 +++ CallTargetTest.java 23 Jul 2004 20:16:29 -0000 1.9 @@ -63,6 +63,10 @@ expectLog("multiple-targets", "tadadctbdbtc"); } + public void testMultipleTargets2() { + expectLog("multiple-targets-2", "dadctb"); + } + public void tearDown() { project.executeTarget("cleanup"); } 1.15 +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.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- ant.xml 24 Jun 2004 19:30:03 -0000 1.14 +++ ant.xml 23 Jul 2004 20:16:29 -0000 1.15 @@ -206,6 +206,13 @@ </ant> </target> + <target name="multiple-targets-2"> + <ant antfile="ant.xml"> + <target name="tb" /> + <target name="da" /> + </ant> + </target> + <target name="ta"><echo>ta</echo></target> <target name="tb" depends="da,dc"><echo>tb</echo></target> <target name="tc" depends="db,dc"><echo>tc</echo></target> 1.5 +7 -0 ant/src/etc/testcases/taskdefs/calltarget.xml Index: calltarget.xml =================================================================== RCS file: /home/cvs/ant/src/etc/testcases/taskdefs/calltarget.xml,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- calltarget.xml 24 Jun 2004 19:30:03 -0000 1.4 +++ calltarget.xml 23 Jul 2004 20:16:29 -0000 1.5 @@ -65,6 +65,13 @@ </antcall> </target> + <target name="multiple-targets-2"> + <ant antfile="ant.xml"> + <target name="tb" /> + <target name="da" /> + </ant> + </target> + <target name="ta"><echo>ta</echo></target> <target name="tb" depends="da,dc"><echo>tb</echo></target> <target name="tc" depends="db,dc"><echo>tc</echo></target>
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]