Hello, "keep-going" feature can be very useful, especially in automatic testing. I have experimented with Project.executeTarget() method to implement this functionality. It seems like a simple patch. The goal of the modification is to execute all targets that do not depend on failed targets. If you think the approach is correct, I can submit a diff patch.
============================== This is the build file I executed (target "b" should be executed even if target "a" failed, "main" should not be executed): ============================== <?xml version="1.0"?> <project default="main" basedir="."> <target name="a"> <echo message="A"/> <fail message="something is wrong"/> </target> <target name="b"> <echo message="B"/> </target> <target name="main" depends="a,b"> <echo message="main"/> </target> </project> ============================== Build output: ============================== Buildfile: build.xml a: [echo] A Target 'a' failed. b: [echo] B Cannot execute 'main' - 'a' was not executed. BUILD FAILED D:\tools\apache-ant-1.6alpha\dist\build.xml:5: something is wrong Total time: 0 seconds ============================== Modified Project.executeTarget() method: ============================== public void executeTarget(String targetName) throws BuildException { // sanity check ourselves, if we've been asked to build nothing // then we should complain if (targetName == null) { String msg = "No target specified"; throw new BuildException(msg); } // Sort the dependency tree, and run everything from the // beginning until we hit our targetName. // Sorting checks if all the targets (and dependencies) // exist, and if there is any cycle in the dependency // graph. Vector sortedTargets = topoSort(targetName, targets); Set executed=new HashSet(); BuildException buildException=null; for (Enumeration iter=sortedTargets.elements(); iter.hasMoreElements();) { Target curtarget = (Target) iter.nextElement(); boolean canExecute=true; for (Enumeration dep_iter=curtarget.getDependencies(); dep_iter.hasMoreElements();) { String dependencyName=((String)dep_iter.nextElement()); if (!executed.contains(dependencyName)) { canExecute=false; log(curtarget, "Cannot execute '"+curtarget.getName()+"' - '"+dependencyName+"' was not executed.", MSG_ERR); } } if (canExecute) { try { curtarget.performTasks(); executed.add(curtarget.getName()); } catch (BuildException ex) { log(curtarget, "Target '"+curtarget.getName()+"' failed.", MSG_ERR); if (buildException==null) { buildException=ex; } else { log(curtarget, "Extra error: "+ex.getMessage(), MSG_ERR); } } } if (curtarget.getName().equals(targetName)) // very strange exit condition break; } if (buildException!=null) throw buildException; } - Alexey. -- { http://trelony.cjb.net/ } Alexey N. Solofnenko Pleasant Hill, CA (GMT-8 usually) --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]