1#!/usr/bin/env python 2# Copyright 2022 The Chromium Authors 3# Use of this source code is governed by a BSD-style license that can be 4# found in the LICENSE file. 5"""Merge javascript results from code-coverage/pgo swarming runs. 6 7Called by merge_results.py 8""" 9 10import argparse 11import json 12import logging 13import os 14import subprocess 15import sys 16 17import merge_lib as profile_merger 18import merge_js_lib as javascript_merger 19 20 21def _MergeAPIArgumentParser(*args, **kwargs): 22 parser = argparse.ArgumentParser(*args, **kwargs) 23 parser.add_argument('--task-output-dir', help=argparse.SUPPRESS) 24 parser.add_argument('--javascript-coverage-dir', 25 help='directory for JavaScript coverage data') 26 parser.add_argument('--chromium-src-dir', 27 help='directory for chromium/src checkout') 28 parser.add_argument( 29 '--build-dir', 30 help='directory for the build directory in chromium/src') 31 return parser 32 33 34def main(): 35 parser = _MergeAPIArgumentParser() 36 params = parser.parse_args() 37 38 parsed_scripts = javascript_merger.write_parsed_scripts( 39 params.task_output_dir) 40 41 # Ensure JavaScript coverage dir exists. 42 if not os.path.exists(params.javascript_coverage_dir): 43 os.makedirs(params.javascript_coverage_dir) 44 45 if not parsed_scripts: 46 logging.warning('No parsed scripts written') 47 return 48 49 logging.info('Raw parsed scripts written out to %s', parsed_scripts) 50 coverage_dirs = javascript_merger.get_raw_coverage_dirs( 51 params.task_output_dir) 52 logging.info('Identified directories containing coverage %s', 53 coverage_dirs) 54 55 try: 56 logging.info('Converting raw coverage to istanbul') 57 javascript_merger.convert_raw_coverage_to_istanbul( 58 coverage_dirs, parsed_scripts, params.task_output_dir) 59 60 istanbul_coverage_dir = os.path.join(params.task_output_dir, 61 'istanbul') 62 output_dir = os.path.join(istanbul_coverage_dir, 'merged') 63 os.makedirs(output_dir, exist_ok=True) 64 65 coverage_file_path = os.path.join(output_dir, 'coverage.json') 66 logging.info('Merging istanbul reports to %s', coverage_file_path) 67 javascript_merger.merge_istanbul_reports(istanbul_coverage_dir, 68 parsed_scripts, 69 coverage_file_path) 70 71 logging.info('Excluding uninteresting lines from coverage') 72 javascript_merger.exclude_uninteresting_lines(coverage_file_path) 73 74 logging.info( 75 'Remapping all paths relative to the src dir and removing any ' + 76 'files in the out dir') 77 javascript_merger.remap_paths_to_relative(coverage_file_path, 78 params.chromium_src_dir, 79 params.build_dir) 80 81 logging.info('Creating lcov report at %s', 82 params.javascript_coverage_dir) 83 javascript_merger.generate_coverage_reports( 84 output_dir, params.javascript_coverage_dir) 85 except RuntimeError as e: 86 logging.warning('Failed executing istanbul tasks: %s', e) 87 88 89if __name__ == '__main__': 90 logging.basicConfig(format='[%(asctime)s %(levelname)s] %(message)s', 91 level=logging.INFO) 92 sys.exit(main()) 93