Jelajahi Sumber

Improved remote repository exception handling.

Jonas Borgström 11 tahun lalu
induk
melakukan
1ee159a939
1 mengubah file dengan 9 tambahan dan 16 penghapusan
  1. 9 16
      attic/remote.py

+ 9 - 16
attic/remote.py

@@ -44,7 +44,7 @@ class RepositoryServer(object):
                             f = getattr(self.repository, method)
                         res = f(*args)
                     except Exception as e:
-                        sys.stdout.buffer.write(msgpack.packb((1, msgid, e.__class__.__name__, None)))
+                        sys.stdout.buffer.write(msgpack.packb((1, msgid, e.__class__.__name__, e.args)))
                     else:
                         sys.stdout.buffer.write(msgpack.packb((1, msgid, None, res)))
                     sys.stdout.flush()
@@ -70,6 +70,7 @@ class RemoteRepository(object):
             self.name = name
 
     def __init__(self, location, create=False):
+        self.location = location
         self.preload_ids = []
         self.msgid = 0
         self.to_send = b''
@@ -77,7 +78,6 @@ class RemoteRepository(object):
         self.ignore_responses = set()
         self.responses = {}
         self.unpacker = msgpack.Unpacker(use_list=False)
-        self.repository_url = '%s@%s:%s' % (location.user, location.host, location.path)
         self.p = None
         if location.host == '__testsuite__':
             args = [sys.executable, '-m', 'attic.archiver', 'serve']
@@ -101,13 +101,7 @@ class RemoteRepository(object):
         version = self.call('negotiate', 1)
         if version != 1:
             raise Exception('Server insisted on using unsupported protocol version %d' % version)
-        try:
-            self.id = self.call('open', location.path, create)
-        except self.RPCError as e:
-            if e.name == b'DoesNotExist':
-                raise Repository.DoesNotExist(self.repository_url)
-            elif e.name == b'AlreadyExists':
-                raise Repository.AlreadyExists(self.repository_url)
+        self.id = self.call('open', location.path, create)
 
     def __del__(self):
         self.close()
@@ -132,6 +126,10 @@ class RemoteRepository(object):
                     error, res = self.responses.pop(waiting_for[0])
                     waiting_for.pop(0)
                     if error:
+                        if error == b'DoesNotExist':
+                            raise Repository.DoesNotExist(self.location.orig)
+                        elif error == b'AlreadyExists':
+                            raise Repository.AlreadyExists(self.location.orig)
                         raise self.RPCError(error)
                     else:
                         yield res
@@ -189,13 +187,8 @@ class RemoteRepository(object):
             return resp
 
     def get_many(self, ids, is_preloaded=False):
-        try:
-            for resp in self.call_many('get', [(id_,) for id_ in ids], is_preloaded=is_preloaded):
-                yield resp
-        except self.RPCError as e:
-            if e.name == b'DoesNotExist':
-                raise Repository.DoesNotExist(self.repository_url)
-            raise
+        for resp in self.call_many('get', [(id_,) for id_ in ids], is_preloaded=is_preloaded):
+            yield resp
 
     def put(self, id_, data, wait=True):
         return self.call('put', id_, data, wait=wait)