From 3abce4259fba8a3005272b4531795a1d0d3ca994 Mon Sep 17 00:00:00 2001 From: Aanand Prasad Date: Wed, 30 Apr 2014 11:53:23 +0100 Subject: [PATCH] Fix regression in handling of build errors --- fig/cli/main.py | 2 +- fig/service.py | 20 ++++++++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/fig/cli/main.py b/fig/cli/main.py index 39ed9f60b..a5f88dbc3 100644 --- a/fig/cli/main.py +++ b/fig/cli/main.py @@ -52,7 +52,7 @@ def main(): log.error(e.explanation) sys.exit(1) except BuildError as e: - log.error("Service '%s' failed to build." % e.service.name) + log.error("Service '%s' failed to build: %s" % (e.service.name, e.reason)) sys.exit(1) diff --git a/fig/service.py b/fig/service.py index 2c7cc1c89..597c3731d 100644 --- a/fig/service.py +++ b/fig/service.py @@ -23,8 +23,9 @@ DOCKER_CONFIG_HINTS = { class BuildError(Exception): - def __init__(self, service): + def __init__(self, service, reason): self.service = service + self.reason = reason class CannotBeScaledError(Exception): @@ -307,7 +308,10 @@ class Service(object): stream=True ) - all_events = stream_output(build_output, sys.stdout) + try: + all_events = stream_output(build_output, sys.stdout) + except StreamOutputError, e: + raise BuildError(self, unicode(e)) image_id = None @@ -338,6 +342,10 @@ class Service(object): return True +class StreamOutputError(Exception): + pass + + def stream_output(output, stream): is_terminal = hasattr(stream, 'fileno') and os.isatty(stream.fileno()) all_events = [] @@ -362,11 +370,7 @@ def stream_output(output, stream): # move cursor up `diff` rows stream.write("%c[%dA" % (27, diff)) - try: - print_output_event(event, stream, is_terminal) - except Exception: - stream.write(repr(event) + "\n") - raise + print_output_event(event, stream, is_terminal) if 'id' in event and is_terminal: # move cursor back down @@ -378,7 +382,7 @@ def stream_output(output, stream): def print_output_event(event, stream, is_terminal): if 'errorDetail' in event: - raise Exception(event['errorDetail']['message']) + raise StreamOutputError(event['errorDetail']['message']) terminator = ''