From 70ed243b32ca8c52aa56289ad98ad8072cccf154 Mon Sep 17 00:00:00 2001 From: derrod Date: Wed, 9 Sep 2020 10:13:03 +0200 Subject: [PATCH] [utils] Add manifest combiner for delta manifests --- legendary/utils/manifests.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 legendary/utils/manifests.py diff --git a/legendary/utils/manifests.py b/legendary/utils/manifests.py new file mode 100644 index 0000000..aa85d44 --- /dev/null +++ b/legendary/utils/manifests.py @@ -0,0 +1,28 @@ +from legendary.models.manifest import Manifest + + +def combine_manifests(base_manifest: Manifest, delta_manifest: Manifest): + added = set() + # overwrite file elements with the ones from the delta manifest + for idx, file_elem in enumerate(base_manifest.file_manifest_list.elements): + try: + delta_file = delta_manifest.file_manifest_list.get_file_by_path(file_elem.filename) + base_manifest.file_manifest_list.elements[idx] = delta_file + added.add(delta_file.filename) + except ValueError: + pass + + # add other files that may be missing + for delta_file in delta_manifest.file_manifest_list.elements: + if delta_file.filename not in added: + base_manifest.file_manifest_list.elements.append(delta_file) + # update count and clear map + base_manifest.file_manifest_list.count = len(base_manifest.file_manifest_list.elements) + base_manifest.file_manifest_list._path_map = None + + # add chunks from delta manifest to main manifest and again clear path caches + base_manifest.chunk_data_list.elements.extend(delta_manifest.chunk_data_list.elements) + base_manifest.chunk_data_list.count = len(base_manifest.chunk_data_list.elements) + base_manifest.chunk_data_list._guid_map = None + base_manifest.chunk_data_list._guid_int_map = None + base_manifest.chunk_data_list._path_map = None