diff --git a/fig/cli/log_printer.py b/fig/cli/log_printer.py index 0fe3215e6cf..96d1031535b 100644 --- a/fig/cli/log_printer.py +++ b/fig/cli/log_printer.py @@ -4,7 +4,7 @@ from itertools import cycle -from .multiplexer import Multiplexer +from .multiplexer import Multiplexer, STOP from . import colors from .utils import split_buffer @@ -34,7 +34,13 @@ def _make_log_generator(self, container, color_fn): prefix = color_fn(container.name + " | ") # Attach to container before log printer starts running line_generator = split_buffer(self._attach(container), '\n') - return (prefix + line.decode('utf-8') for line in line_generator) + + for line in line_generator: + yield prefix + line.decode('utf-8') + + exit_code = container.wait() + yield color_fn("%s exited with code %s\n" % (container.name, exit_code)) + yield STOP def _attach(self, container): params = { diff --git a/fig/cli/multiplexer.py b/fig/cli/multiplexer.py index 579f3bcac3f..849dbd66a2b 100644 --- a/fig/cli/multiplexer.py +++ b/fig/cli/multiplexer.py @@ -7,6 +7,11 @@ from queue import Queue, Empty # Python 3.x +# Yield STOP from an input generator to stop the +# top-level loop without processing any more input. +STOP = object() + + class Multiplexer(object): def __init__(self, generators): self.generators = generators @@ -17,7 +22,11 @@ def loop(self): while True: try: - yield self.queue.get(timeout=0.1) + item = self.queue.get(timeout=0.1) + if item is STOP: + break + else: + yield item except Empty: pass