# Relentless

The <relentless> task will execute all of the nested tasks, regardless of whether one or more of the nested tasks fails. When <relentless> has completed executing the nested tasks, it will either

- fail, if any one or more of the nested tasks failed; or
- succeed, if all of the nested tasks succeeded.

An appropriate message will be written to the log.

Tasks are executed in the order that they appear within the <relentless> task. It is up to the user to ensure that relentless execution of the nested tasks is safe.

This task only works for ant version greater than or equal to ant 1.6.0.

## Parameters

Attribute | Description | Required
--- | --- | ---
description | A string that will be included in the log output. This can be useful for helping to identify sections of large Ant builds. | No
terse | Setting this to `true` will eliminate some of the progress output generated by <relentless>. This can reduce clutter in some cases. The default value is `false`. | No

## Nested elements

### task list

The only nested element supported by <relentless> is a list of tasks to be executed. At least one task must be specified.

It is important to note that <relentless> only proceeds relentlessly from one task to the next - it does not apply recursively to any tasks that might be invoked by these nested tasks. If a nested task invokes some other list of tasks (perhaps by <antcall> for example), and one of those other tasks fails, then the nested task will stop at that point.

### Example

A relentless task to print out the first five canonical variable names:

>     <relentless description="The first five canonical variable names.">
>         <echo>foo</echo>
>         <echo>bar</echo>
>         <echo>baz</echo>
>         <echo>bat</echo>
>         <echo>blah</echo>
>     </relentless>

which should produce output looking more or less like

>     [relentless] Relentlessly executing: The first five canonical variable names.
>     [relentless] Executing: task 1
>          [echo] foo
>     [relentless] Executing: task 2
>          [echo] bar
>     [relentless] Executing: task 3
>          [echo] baz
>     [relentless] Executing: task 4
>          [echo] bat
>     [relentless] Executing: task 5
>          [echo] blah
>     [relentless] All tasks completed successfully.

If you change the first line to set the `terse` parameter,

        <relentless terse="true" description="The first five canonical variable names."/>

the output will look more like this:

>     [relentless] Relentlessly executing: The first five canonical variable names.
>          [echo] foo
>          [echo] bar
>          [echo] baz
>          [echo] bat
>          [echo] blah
>     [relentless] All tasks completed successfully.

If we change the third task to deliberately fail

>     <relentless terse="true" description="The first five canonical variable names.">
>         <echo>foo</echo>
>         <echo>bar</echo>
>         <fail>baz</fail>
>         <echo>bat</echo>
>         <echo>blah</echo>
>     </relentless>

then the output should look something like this.

>     [relentless] Relentlessly executing: The first five canonical variable names.
>          [echo] foo
>          [echo] bar
>     [relentless] Task task 3 failed: baz
>          [echo] bat
>          [echo] blah

>     BUILD FAILED
>     /home/richter/firmware/sensor/build.xml:1177: Relentless execution: 1 of 5 tasks failed.

Copyright © 2005 Ant-Contrib Project. All rights Reserved.