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