From c679f1a6f05f4f14d69836d35af6e570703b5d14 Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Sat, 21 Mar 2015 02:17:19 +0100 Subject: [PATCH] catch all Exceptions, transmit traceback back from remote before this changesets, most informations about exceptions/tracebacks on the remote side were lost. now they are transmitted and displayed, together with the remote attic version. --- attic/archiver.py | 3 +++ attic/remote.py | 12 ++++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/attic/archiver.py b/attic/archiver.py index 47650c2d4..021d59dba 100644 --- a/attic/archiver.py +++ b/attic/archiver.py @@ -728,6 +728,9 @@ def main(): except Error as e: archiver.print_error(e.get_message()) exit_code = e.exit_code + except RemoteRepository.RPCError as e: + print(e) + exit_code = 1 except KeyboardInterrupt: archiver.print_error('Error: Keyboard interrupt') exit_code = 1 diff --git a/attic/remote.py b/attic/remote.py index f2a0aed06..c3baa52d4 100644 --- a/attic/remote.py +++ b/attic/remote.py @@ -7,6 +7,9 @@ from subprocess import Popen, PIPE import sys import tempfile +import traceback + +from attic import __version__ from .hashindex import NSIndex from .helpers import Error, IntegrityError @@ -52,8 +55,9 @@ def serve(self): except AttributeError: f = getattr(self.repository, method) res = f(*args) - except Exception as e: - sys.stdout.buffer.write(msgpack.packb((1, msgid, e.__class__.__name__, e.args))) + except BaseException as e: + exc = "Remote Traceback by Attic %s%s%s" % (__version__, os.linesep, traceback.format_exc()) + sys.stdout.buffer.write(msgpack.packb((1, msgid, e.__class__.__name__, exc))) else: sys.stdout.buffer.write(msgpack.packb((1, msgid, None, res))) sys.stdout.flush() @@ -157,7 +161,7 @@ def fetch_from_cache(args): raise PathNotAllowed(*res) if error == b'ObjectNotFound': raise Repository.ObjectNotFound(res[0], self.location.orig) - raise self.RPCError(error) + raise self.RPCError(res.decode('utf-8')) else: yield res if not waiting_for and not calls: @@ -312,4 +316,4 @@ def get_many(self, keys): def cache_if_remote(repository): if isinstance(repository, RemoteRepository): return RepositoryCache(repository) - return repository \ No newline at end of file + return repository