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: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org
|