Преглед изворни кода

Merge pull request #7044 from ThomasWaldmann/repoobj-fixes

repoobj: mutate meta + misc minor fixes / updates
TW пре 2 година
родитељ
комит
600606897e
2 измењених фајлова са 16 додато и 6 уклоњено
  1. 15 5
      src/borg/repoobj.py
  2. 1 1
      src/borg/testsuite/repoobj.py

+ 15 - 5
src/borg/repoobj.py

@@ -35,7 +35,6 @@ class RepoObj:
     ) -> bytes:
     ) -> bytes:
         assert isinstance(id, bytes)
         assert isinstance(id, bytes)
         assert isinstance(meta, dict)
         assert isinstance(meta, dict)
-        meta = dict(meta)  # make a copy, so call arg is not modified
         assert isinstance(data, (bytes, memoryview))
         assert isinstance(data, (bytes, memoryview))
         assert compress or size is not None and ctype is not None and clevel is not None
         assert compress or size is not None and ctype is not None and clevel is not None
         if compress:
         if compress:
@@ -115,14 +114,22 @@ class RepoObj1:  # legacy
     def id_hash(self, data: bytes) -> bytes:
     def id_hash(self, data: bytes) -> bytes:
         return self.key.id_hash(data)
         return self.key.id_hash(data)
 
 
-    def format(self, id: bytes, meta: dict, data: bytes, compress: bool = True, size: int = None) -> bytes:
+    def format(
+        self,
+        id: bytes,
+        meta: dict,
+        data: bytes,
+        compress: bool = True,
+        size: int = None,
+        ctype: int = None,
+        clevel: int = None,
+    ) -> bytes:
         assert isinstance(id, bytes)
         assert isinstance(id, bytes)
         assert meta == {}
         assert meta == {}
         assert isinstance(data, (bytes, memoryview))
         assert isinstance(data, (bytes, memoryview))
-        assert compress or size is not None
-        assert compress or size is not None
+        assert compress or size is not None and ctype is not None and clevel is not None
         if compress:
         if compress:
-            assert size is None
+            assert size is None or size == len(data)
             meta, data_compressed = self.compressor.compress(meta, data)
             meta, data_compressed = self.compressor.compress(meta, data)
         else:
         else:
             assert isinstance(size, int)
             assert isinstance(size, int)
@@ -130,6 +137,9 @@ class RepoObj1:  # legacy
         data_encrypted = self.key.encrypt(id, data_compressed)
         data_encrypted = self.key.encrypt(id, data_compressed)
         return data_encrypted
         return data_encrypted
 
 
+    def parse_meta(self, id: bytes, cdata: bytes) -> dict:
+        raise NotImplementedError("parse_meta is not available for RepoObj1")
+
     def parse(self, id: bytes, cdata: bytes, decompress: bool = True) -> tuple[dict, bytes]:
     def parse(self, id: bytes, cdata: bytes, decompress: bool = True) -> tuple[dict, bytes]:
         assert isinstance(id, bytes)
         assert isinstance(id, bytes)
         assert isinstance(cdata, bytes)
         assert isinstance(cdata, bytes)

+ 1 - 1
src/borg/testsuite/repoobj.py

@@ -78,7 +78,7 @@ def test_borg1_borg2_transition(key):
     # note: as we did not decompress, we do not have "size" and we need to get it from somewhere else.
     # note: as we did not decompress, we do not have "size" and we need to get it from somewhere else.
     # here, we just use len_data. for borg transfer, we also know the size from another metadata source.
     # here, we just use len_data. for borg transfer, we also know the size from another metadata source.
     borg2_cdata = repo_objs2.format(
     borg2_cdata = repo_objs2.format(
-        id, meta1, compr_data1[2:], compress=False, size=len_data, ctype=meta1["ctype"], clevel=meta1["clevel"]
+        id, dict(meta1), compr_data1[2:], compress=False, size=len_data, ctype=meta1["ctype"], clevel=meta1["clevel"]
     )
     )
     meta2, data2 = repo_objs2.parse(id, borg2_cdata)
     meta2, data2 = repo_objs2.parse(id, borg2_cdata)
     assert data2 == data
     assert data2 == data