Browse Source

Merge pull request #6326 from hexagonrecursion/bp-setdefault

Backport: implement more standard hashindex.setdefault behaviour
TW 3 years ago
parent
commit
28d22a9501
2 changed files with 17 additions and 0 deletions
  1. 1 0
      src/borg/hashindex.pyx
  2. 16 0
      src/borg/testsuite/hashindex.py

+ 1 - 0
src/borg/hashindex.pyx

@@ -128,6 +128,7 @@ cdef class IndexBase:
     def setdefault(self, key, value):
         if not key in self:
             self[key] = value
+        return self[key]
 
     def __delitem__(self, key):
         assert len(key) == self.key_size

+ 16 - 0
src/borg/testsuite/hashindex.py

@@ -71,6 +71,22 @@ class HashIndexTestCase(BaseTestCase):
         del idx
         self.assert_equal(len(cls.read(idx_name.name)), 0)
 
+        idx = cls()
+        # Test setdefault - set non-existing key
+        idx.setdefault(H(0), make_value(42))
+        assert H(0) in idx
+        assert idx[H(0)] == make_value(42)
+        # Test setdefault - do not set existing key
+        idx.setdefault(H(0), make_value(23))
+        assert H(0) in idx
+        assert idx[H(0)] == make_value(42)
+        # Test setdefault - get-like return value, key not present
+        assert idx.setdefault(H(1), make_value(23)) == make_value(23)
+        # Test setdefault - get-like return value, key present
+        assert idx.setdefault(H(0), make_value(23)) == make_value(42)
+        # clean up setdefault test
+        del idx
+
     def test_nsindex(self):
         self._generic_test(NSIndex, lambda x: (x, x),
                            '85f72b036c692c8266e4f51ccf0cff2147204282b5e316ae508d30a448d88fef')