diff options
Diffstat (limited to 'tools/releasetools/common.py')
| -rw-r--r-- | tools/releasetools/common.py | 51 |
1 files changed, 36 insertions, 15 deletions
diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py index acf98117dd..5e70af1e7d 100644 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -1033,15 +1033,35 @@ def MergeDynamicPartitionInfoDicts(framework_dict, vendor_dict): Returns: The merged dynamic partition info dictionary. """ - merged_dict = {} + + def uniq_concat(a, b): + combined = set(a.split(" ")) + combined.update(set(b.split(" "))) + combined = [item.strip() for item in combined if item.strip()] + return " ".join(sorted(combined)) + + if (framework_dict.get("use_dynamic_partitions") != + "true") or (vendor_dict.get("use_dynamic_partitions") != "true"): + raise ValueError("Both dictionaries must have use_dynamic_partitions=true") + + merged_dict = {"use_dynamic_partitions": "true"} + + merged_dict["dynamic_partition_list"] = uniq_concat( + framework_dict.get("dynamic_partition_list", ""), + vendor_dict.get("dynamic_partition_list", "")) + + # Super block devices are defined by the vendor dict. + if "super_block_devices" in vendor_dict: + merged_dict["super_block_devices"] = vendor_dict["super_block_devices"] + for block_device in merged_dict["super_block_devices"].split(" "): + key = "super_%s_device_size" % block_device + if key not in vendor_dict: + raise ValueError("Vendor dict does not contain required key %s." % key) + merged_dict[key] = vendor_dict[key] + # Partition groups and group sizes are defined by the vendor dict because # these values may vary for each board that uses a shared system image. merged_dict["super_partition_groups"] = vendor_dict["super_partition_groups"] - framework_dynamic_partition_list = framework_dict.get( - "dynamic_partition_list", "") - vendor_dynamic_partition_list = vendor_dict.get("dynamic_partition_list", "") - merged_dict["dynamic_partition_list"] = ("%s %s" % ( - framework_dynamic_partition_list, vendor_dynamic_partition_list)).strip() for partition_group in merged_dict["super_partition_groups"].split(" "): # Set the partition group's size using the value from the vendor dict. key = "super_%s_group_size" % partition_group @@ -1052,15 +1072,16 @@ def MergeDynamicPartitionInfoDicts(framework_dict, vendor_dict): # Set the partition group's partition list using a concatenation of the # framework and vendor partition lists. key = "super_%s_partition_list" % partition_group - merged_dict[key] = ( - "%s %s" % - (framework_dict.get(key, ""), vendor_dict.get(key, ""))).strip() - - # Pick virtual ab related flags from vendor dict, if defined. - if "virtual_ab" in vendor_dict.keys(): - merged_dict["virtual_ab"] = vendor_dict["virtual_ab"] - if "virtual_ab_retrofit" in vendor_dict.keys(): - merged_dict["virtual_ab_retrofit"] = vendor_dict["virtual_ab_retrofit"] + merged_dict[key] = uniq_concat( + framework_dict.get(key, ""), vendor_dict.get(key, "")) + + # Various other flags should be copied from the vendor dict, if defined. + for key in ("virtual_ab", "virtual_ab_retrofit", "lpmake", + "super_metadata_device", "super_partition_error_limit", + "super_partition_size"): + if key in vendor_dict.keys(): + merged_dict[key] = vendor_dict[key] + return merged_dict |