Hans Dockter wrote:
Hi,
I'm thinking about the best way to implement stopping a Gradle build.
One way to do it would be to add a type BuildController. A instance of
this can be optionally passed to the Gradle.run method. The TaskExecuter
and the Task will be associated with an instance of BuildController. If
the state of the build controller is changed to stop, the TaskExecuter,
Task, etc can react upon this and will throw eventually a
BuildInterruptedException. This is a pretty intrusive approach. It has
the additional draw back, that every task needs to be smart about this
to make it work well. For example a task that delegates to an Ant task
must wait with stopping the build until the Ant task has finished.
I think that every task that can take advantage of this does need to be smart
about it. They may have differing requirements for how to cleanly stop. Tasks
that can't stop (like ones that now delegate to ant) don't have to do anything.
They will execute as normal and allow the TaskExecutor to stop further execution.
I think that tasks shouldn't have to poll the state of the BuildController, but
should be able to register as a listener for a cancellation request. It would
seem clean to me to just add a BuildListener.cancelRequested method. Tasks that
can cancel can register as a listener. Or perhaps you could add another
listener interface for this purpse.
Another way of doing this is to still add a type BuildController. You
can send a StopEvent to the BuildController. We have a separate Thread
that receives this StopEvent. If it is received, the Thread running the
Gradle build will be stopped.
I'm worried that just killing the Gradle thread will be unsafe. When there are
multiple child threads (like is currently done for change detection or will be
done for new test execution), I'm not sure that they will all be stopped
appropriately. I would also worry about possibly corrupting some type of state
files (like change detection uses) if it was terminated at the wrong time.
--
Steve Appling
Automated Logic Research Team
---------------------------------------------------------------------
To unsubscribe from this list, please visit:
http://xircles.codehaus.org/manage_email