Переглянути джерело

Introduce a separate exception for missing repository objects

Jonas Borgström 10 роки тому
батько
коміт
5a69f58823
3 змінених файлів з 12 додано та 7 видалено
  1. 2 0
      attic/remote.py
  2. 5 2
      attic/repository.py
  3. 5 5
      attic/testsuite/repository.py

+ 2 - 0
attic/remote.py

@@ -155,6 +155,8 @@ class RemoteRepository(object):
                             raise IntegrityError(res)
                         elif error == b'PathNotAllowed':
                             raise PathNotAllowed(*res)
+                        if error == b'ObjectNotFound':
+                            raise Repository.ObjectNotFound(res[0], self.location.orig)
                         raise self.RPCError(error)
                     else:
                         yield res

+ 5 - 2
attic/repository.py

@@ -44,6 +44,9 @@ class Repository(object):
     class CheckNeeded(Error):
         '''Inconsistency detected. Please run "attic check {}"'''
 
+    class ObjectNotFound(Error):
+        """Object with key {} not found in repository {}"""
+
     def __init__(self, path, create=False, exclusive=False):
         self.path = path
         self.io = None
@@ -334,7 +337,7 @@ class Repository(object):
             segment, offset = self.index[id_]
             return self.io.read(segment, offset, id_)
         except KeyError:
-            raise self.DoesNotExist(self.path)
+            raise self.ObjectNotFound(id_, self.path)
 
     def get_many(self, ids, is_preloaded=False):
         for id_ in ids:
@@ -363,7 +366,7 @@ class Repository(object):
         try:
             segment, offset = self.index.pop(id)
         except KeyError:
-            raise self.DoesNotExist(self.path)
+            raise self.ObjectNotFound(id, self.path)
         self.segments[segment] -= 1
         self.compact.add(segment)
         segment = self.io.write_delete(id)

+ 5 - 5
attic/testsuite/repository.py

@@ -36,11 +36,11 @@ class RepositoryTestCase(RepositoryTestCaseBase):
         key50 = ('%-32d' % 50).encode('ascii')
         self.assert_equal(self.repository.get(key50), b'SOMEDATA')
         self.repository.delete(key50)
-        self.assert_raises(Repository.DoesNotExist, lambda: self.repository.get(key50))
+        self.assert_raises(Repository.ObjectNotFound, lambda: self.repository.get(key50))
         self.repository.commit()
         self.repository.close()
         repository2 = self.open()
-        self.assert_raises(Repository.DoesNotExist, lambda: repository2.get(key50))
+        self.assert_raises(Repository.ObjectNotFound, lambda: repository2.get(key50))
         for x in range(100):
             if x == 50:
                 continue
@@ -68,7 +68,7 @@ class RepositoryTestCase(RepositoryTestCaseBase):
         self.repository.put(b'00000000000000000000000000000000', b'bar')
         self.assert_equal(self.repository.get(b'00000000000000000000000000000000'), b'bar')
         self.repository.delete(b'00000000000000000000000000000000')
-        self.assert_raises(Repository.DoesNotExist, lambda: self.repository.get(b'00000000000000000000000000000000'))
+        self.assert_raises(Repository.ObjectNotFound, lambda: self.repository.get(b'00000000000000000000000000000000'))
 
     def test_consistency2(self):
         """Test cache consistency2
@@ -258,7 +258,7 @@ class RepositoryCheckTestCase(RepositoryTestCaseBase):
     def test_repair_missing_commit_segment(self):
         self.add_objects([[1, 2, 3], [4, 5, 6]])
         self.delete_segment(1)
-        self.assert_raises(Repository.DoesNotExist, lambda: self.get_objects(4))
+        self.assert_raises(Repository.ObjectNotFound, lambda: self.get_objects(4))
         self.assert_equal(set([1, 2, 3]), self.list_objects())
 
     def test_repair_corrupted_commit_segment(self):
@@ -266,7 +266,7 @@ class RepositoryCheckTestCase(RepositoryTestCaseBase):
         with open(os.path.join(self.tmppath, 'repository', 'data', '0', '1'), 'r+b') as fd:
             fd.seek(-1, os.SEEK_END)
             fd.write(b'X')
-        self.assert_raises(Repository.DoesNotExist, lambda: self.get_objects(4))
+        self.assert_raises(Repository.ObjectNotFound, lambda: self.get_objects(4))
         self.check(status=True)
         self.get_objects(3)
         self.assert_equal(set([1, 2, 3]), self.list_objects())