fabric/fabric — pull request #1228 by Kami (2014-12-08 10:34:17+00:00)
Title: Fix underlying exception reporting for CommandTimeout exceptions

Currently if you run tasks in parallel mode and one of the hosts throws `CommandTimeout`, `fabric.utils.error` will return underlying exception as an empty string.

For example:

```
Fatal error: One or more hosts failed while executing task 'local'

Underlying exception:

Aborting.
```

The reason for that is that `CommandTimeout` class doesn't have `message` attribute so calling `str()` on it will return an empty string.

> In [1]: from fabric.exceptions import CommandTimeout
>
> In [2]: str(CommandTimeout())
> Out[2]: ''

In this pull request I've added `message` attribute to the class so the underlying exception is now reported correctly.

> In [1]: from fabric.exceptions import CommandTimeout
>
> In [2]: str(CommandTimeout(1))
> Out[2]: 'Command failed to finish in 1 seconds'