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 logging 12import os 13import sys 14 15import merge_js_lib as javascript_merger 16 17 18def _MergeAPIArgumentParser(*args, **kwargs): 19 parser = argparse.ArgumentParser(*args, **kwargs) 20 parser.add_argument('--task-output-dir', help=argparse.SUPPRESS) 21 parser.add_argument('--javascript-coverage-dir', 22 help='directory for JavaScript coverage data') 23 parser.add_argument('--chromium-src-dir', 24 help='directory for chromium/src checkout') 25 parser.add_argument('--build-dir', 26 help='directory for the build directory in chromium/src') 27 return parser 28 29 30def main(): 31 parser = _MergeAPIArgumentParser() 32 params = parser.parse_args() 33 34 parsed_scripts = javascript_merger.write_parsed_scripts( 35 params.task_output_dir) 36 37 # Ensure JavaScript coverage dir exists. 38 if not os.path.exists(params.javascript_coverage_dir): 39 os.makedirs(params.javascript_coverage_dir) 40 41 if not parsed_scripts: 42 logging.warning('No parsed scripts written') 43 return 44 45 logging.info('Raw parsed scripts written out to %s', parsed_scripts) 46 coverage_dirs = javascript_merger.get_raw_coverage_dirs( 47 params.task_output_dir) 48 logging.info('Identified directories containing coverage %s', coverage_dirs) 49 50 try: 51 logging.info('Converting raw coverage to istanbul') 52 javascript_merger.convert_raw_coverage_to_istanbul(coverage_dirs, 53 parsed_scripts, 54 params.task_output_dir) 55 56 istanbul_coverage_dir = os.path.join(params.task_output_dir, 'istanbul') 57 output_dir = os.path.join(istanbul_coverage_dir, 'merged') 58 os.makedirs(output_dir, exist_ok=True) 59 60 coverage_file_path = os.path.join(output_dir, 'coverage.json') 61 logging.info('Merging istanbul reports to %s', coverage_file_path) 62 javascript_merger.merge_istanbul_reports(istanbul_coverage_dir, 63 parsed_scripts, coverage_file_path) 64 65 logging.info('Excluding uninteresting lines from coverage') 66 javascript_merger.exclude_uninteresting_lines(coverage_file_path) 67 68 logging.info('Remapping all paths relative to the src dir and removing any ' 69 'files in the out dir') 70 javascript_merger.remap_paths_to_relative(coverage_file_path, 71 params.chromium_src_dir, 72 params.build_dir) 73 74 logging.info('Creating lcov report at %s', params.javascript_coverage_dir) 75 javascript_merger.generate_coverage_reports(output_dir, 76 params.javascript_coverage_dir) 77 except RuntimeError as e: 78 logging.warning('Failed executing istanbul tasks: %s', e) 79 80 81if __name__ == '__main__': 82 logging.basicConfig(format='[%(asctime)s %(levelname)s] %(message)s', 83 level=logging.INFO) 84 sys.exit(main()) 85