summaryrefslogtreecommitdiffstats
path: root/python/mozbuild/mozbuild/codecoverage/packager.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/mozbuild/mozbuild/codecoverage/packager.py')
-rw-r--r--python/mozbuild/mozbuild/codecoverage/packager.py71
1 files changed, 71 insertions, 0 deletions
diff --git a/python/mozbuild/mozbuild/codecoverage/packager.py b/python/mozbuild/mozbuild/codecoverage/packager.py
new file mode 100644
index 0000000000..92254a96f5
--- /dev/null
+++ b/python/mozbuild/mozbuild/codecoverage/packager.py
@@ -0,0 +1,71 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+import argparse
+import errno
+import json
+import sys
+
+import buildconfig
+import mozpack.path as mozpath
+from mozpack.copier import FileRegistry, Jarrer
+from mozpack.files import FileFinder, GeneratedFile
+from mozpack.manifests import InstallManifest, UnreadableInstallManifest
+
+
+def describe_install_manifest(manifest, dest_dir):
+ try:
+ manifest = InstallManifest(manifest)
+ except UnreadableInstallManifest:
+ raise IOError(errno.EINVAL, "Error parsing manifest file", manifest)
+
+ reg = FileRegistry()
+
+ mapping = {}
+ manifest.populate_registry(reg)
+ dest_dir = mozpath.join(buildconfig.topobjdir, dest_dir)
+ for dest_file, src in reg:
+ if hasattr(src, "path"):
+ dest_path = mozpath.join(dest_dir, dest_file)
+ relsrc_path = mozpath.relpath(src.path, buildconfig.topsrcdir)
+ mapping[dest_path] = relsrc_path
+
+ return mapping
+
+
+def package_coverage_data(root, output_file):
+ finder = FileFinder(root)
+ jarrer = Jarrer()
+ for p, f in finder.find("**/*.gcno"):
+ jarrer.add(p, f)
+
+ dist_include_manifest = mozpath.join(
+ buildconfig.topobjdir, "_build_manifests", "install", "dist_include"
+ )
+ linked_files = describe_install_manifest(dist_include_manifest, "dist/include")
+ mapping_file = GeneratedFile(json.dumps(linked_files, sort_keys=True))
+ jarrer.add("linked-files-map.json", mapping_file)
+ jarrer.copy(output_file)
+
+
+def cli(args=sys.argv[1:]):
+ parser = argparse.ArgumentParser()
+ parser.add_argument(
+ "-o", "--output-file", dest="output_file", help="Path to save packaged data to."
+ )
+ parser.add_argument(
+ "--root", dest="root", default=None, help="Root directory to search from."
+ )
+ args = parser.parse_args(args)
+
+ if not args.root:
+ from buildconfig import topobjdir
+
+ args.root = topobjdir
+
+ return package_coverage_data(args.root, args.output_file)
+
+
+if __name__ == "__main__":
+ sys.exit(cli())