diff --git a/pycobertura/cobertura1.xml b/pycobertura/cobertura1.xml
new file mode 100644
index 00000000..59a4b482
--- /dev/null
+++ b/pycobertura/cobertura1.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pycobertura/cobertura2.xml b/pycobertura/cobertura2.xml
new file mode 100644
index 00000000..9e2a555d
--- /dev/null
+++ b/pycobertura/cobertura2.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pycobertura/merge_coverage.py b/pycobertura/merge_coverage.py
new file mode 100644
index 00000000..e3563c05
--- /dev/null
+++ b/pycobertura/merge_coverage.py
@@ -0,0 +1,59 @@
+import xml.etree.ElementTree as ET
+from collections import defaultdict
+
+
+def merge_coverage_data(files):
+ merged_data = defaultdict(
+ lambda: defaultdict(lambda: defaultdict(lambda: defaultdict(int)))
+ )
+
+ for file in files:
+ tree = ET.parse(file)
+ root = tree.getroot()
+
+ for package in root.findall("./packages/package"):
+ package_name = package.attrib["name"]
+ for class_ in package.findall("classes/class"):
+ class_name = class_.attrib["name"]
+ for method in class_.findall("methods/method"):
+ method_name = method.attrib["name"]
+ for line in method.findall("lines/line"):
+ line_number = line.attrib["number"]
+ hits = int(line.attrib["hits"])
+ merged_data[package_name][class_name][method_name][
+ line_number
+ ] += hits
+
+ return merged_data
+
+
+def generate_merged_xml(merged_data):
+ root = ET.Element("coverage")
+
+ for package_name, package_data in merged_data.items():
+ package_elem = ET.SubElement(root, "package", name=package_name)
+ for class_name, class_data in package_data.items():
+ class_elem = ET.SubElement(package_elem, "class", name=class_name)
+ for method_name, method_data in class_data.items():
+ method_elem = ET.SubElement(class_elem, "method", name=method_name)
+ lines_elem = ET.SubElement(method_elem, "lines")
+ for line_number, hits in method_data.items():
+ ET.SubElement(
+ lines_elem, "line", number=line_number, hits=str(hits)
+ )
+
+ return ET.ElementTree(root)
+
+
+def main():
+ files = ["cobertura1.xml", "cobertura2.xml"] # List of Cobertura XML files to merge
+ merged_data = merge_coverage_data(files)
+
+ merged_xml_tree = generate_merged_xml(merged_data)
+ merged_xml_tree.write(
+ "merged_cobertura.xml", encoding="utf-8", xml_declaration=True
+ )
+
+
+if __name__ == "__main__":
+ main()
diff --git a/pycobertura/merged_cobertura.xml b/pycobertura/merged_cobertura.xml
new file mode 100644
index 00000000..5ed03f61
--- /dev/null
+++ b/pycobertura/merged_cobertura.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file