| #!/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) |