#!/usr/bin/env vpython3 # Copyright (c) 2024 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Redirects to the version of the metrics XML formatter in the Chromium tree. """ import gclient_paths import os import shutil import subprocess import sys def GetMetricsDir(top_dir, path): top_dir = os.path.realpath(top_dir) metrics_xml_dirs = [ os.path.join(top_dir, 'tools', 'metrics', 'actions'), os.path.join(top_dir, 'tools', 'metrics', 'histograms'), os.path.join(top_dir, 'tools', 'metrics', 'structured'), os.path.join(top_dir, 'tools', 'metrics', 'ukm'), ] abs_dirname = os.path.dirname(os.path.realpath(path)) for xml_dir in metrics_xml_dirs: if abs_dirname.startswith(xml_dir): return xml_dir return None def IsSupportedHistogramsXML(path): supported_xmls = set([ 'histograms.xml', 'enums.xml', 'histogram_suffixes_list.xml', ]) return os.path.basename(path) in supported_xmls def log(msg, verbose): if verbose: print(msg) def FindMetricsXMLFormatterTool(path, verbose=False): """Returns a path to the metrics XML formatter executable.""" top_dir = gclient_paths.GetPrimarySolutionPath() if not top_dir: log('Not executed in a Chromium checkout; skip formatting', verbose) return '' xml_dir = GetMetricsDir(top_dir, path) if not xml_dir: log(f'{path} is not a metric XML; skip formatting', verbose) return '' # Just to ensure that the given file is located in the current checkout # folder. If not, skip the formatting. if not os.path.realpath(path).startswith(os.path.realpath(top_dir)): log( f'{path} is not located in the current Chromium checkout; ' 'skip formatting', verbose) return '' histograms_base_dir = os.path.join(top_dir, 'tools', 'metrics', 'histograms') if xml_dir.startswith(histograms_base_dir): # Skips the formatting, if the XML file is not one of the known types. if not IsSupportedHistogramsXML(path): log(f'{path} is not a supported histogram XML; skip formatting', verbose) return '' return os.path.join(xml_dir, 'pretty_print.py') usage_text = """Usage: %s [option] filepath Format a given metrics XML file with the metrics XML formatters in the Chromium checkout. Noop, if executed out of a Chromium checkout. Note that not all the options are understood by all the formatters. Find the formatter binaries for all the options supported by each formatter. positional arguments: filepath if the path is not under tools/metrics, no formatter will be run. options:, -h, --help show this help message and exit' --presubmit --diff""" def _print_help(): print(usage_text % sys.argv[0]) def main(args): path = next((arg for arg in args if not arg.startswith('-')), None) if not path: _print_help() return 0 if not os.path.exists(path): raise FileNotFoundError(f'{path} does not exist.') tool = FindMetricsXMLFormatterTool(path, verbose=True) if not tool: # Fail (almost) silently. return 0 subprocess.run([ shutil.which('vpython3'), tool, ] + args) return 0 if __name__ == '__main__': try: sys.exit(main(sys.argv[1:])) except KeyboardInterrupt: sys.stderr.write('interrupted\n') sys.exit(1)