| Index: gclient_utils.py
|
| diff --git a/gclient_utils.py b/gclient_utils.py
|
| index a70d0fc3370eb75158f48cccbaee2b68a35bce15..7c1c2eb995fedb327bda08df067d4d9ac6469aea 100644
|
| --- a/gclient_utils.py
|
| +++ b/gclient_utils.py
|
| @@ -314,6 +314,29 @@ class StdoutAutoFlush(object):
|
| self.stdout.flush()
|
|
|
|
|
| +class StdoutAnnotated(object):
|
| + """Prepends every line with a string."""
|
| + def __init__(self, prepend, stdout):
|
| + self.prepend = prepend
|
| + self.buf = ''
|
| + self.stdout = stdout
|
| +
|
| + def write(self, out):
|
| + self.buf += out
|
| + while '\n' in self.buf:
|
| + line, self.buf = self.buf.split('\n', 1)
|
| + self.stdout.write(self.prepend + line + '\n')
|
| +
|
| + def flush(self):
|
| + pass
|
| +
|
| + def full_flush(self):
|
| + if self.buf:
|
| + self.stdout.write(self.prepend + self.buf)
|
| + self.stdout.flush()
|
| + self.buf = ''
|
| +
|
| +
|
| def CheckCallAndFilter(args, stdout=None, filter_fn=None,
|
| print_stdout=None, call_filter_on_first_line=False,
|
| **kwargs):
|
| @@ -569,7 +592,7 @@ class ExecutionQueue(object):
|
| self.running.append(t)
|
| else:
|
| t.join()
|
| - t.kwargs['options'].stdout.flush()
|
| + t.kwargs['options'].stdout.full_flush()
|
| if self.progress:
|
| self.progress.update(1)
|
| assert not t.name in self.ran
|
| @@ -580,9 +603,11 @@ class ExecutionQueue(object):
|
| if self.jobs > 1:
|
| # Start the thread.
|
| index = len(self.ran) + len(self.running) + 1
|
| - # Copy 'options' just to be safe.
|
| + # Copy 'options' and add annotated stdout.
|
| task_kwargs = kwargs.copy()
|
| task_kwargs['options'] = copy.copy(task_kwargs['options'])
|
| + task_kwargs['options'].stdout = StdoutAnnotated(
|
| + '%d>' % index, task_kwargs['options'].stdout)
|
| new_thread = self._Worker(task_item, args, task_kwargs)
|
| self.running.append(new_thread)
|
| new_thread.start()
|
|
|