diff --git a/attic/archiver.py b/attic/archiver.py index d2d9cfda0..630c506f9 100644 --- a/attic/archiver.py +++ b/attic/archiver.py @@ -780,6 +780,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 b26d6b871..d7e1ecfa1 100644 --- a/attic/remote.py +++ b/attic/remote.py @@ -7,6 +7,9 @@ import shutil from subprocess import Popen, PIPE import sys import tempfile +import traceback + +from attic import __version__ from .hashindex import NSIndex from .helpers import Error, IntegrityError @@ -75,8 +78,9 @@ class RepositoryServer: except AttributeError: f = getattr(self.repository, method) res = f(*args) - except Exception as e: - os.write(stdout_fd, 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()) + os.write(stdout_fd, msgpack.packb((1, msgid, e.__class__.__name__, exc))) else: os.write(stdout_fd, msgpack.packb((1, msgid, None, res))) if es: @@ -182,7 +186,7 @@ class RemoteRepository: raise Repository.ObjectNotFound(res[0], self.location.orig) elif error == b'InvalidRPCMethod': raise InvalidRPCMethod(*res) - raise self.RPCError(error) + raise self.RPCError(res.decode('utf-8')) else: yield res if not waiting_for and not calls: