149 lines
6.3 KiB
Python
149 lines
6.3 KiB
Python
# Copyright 2021 The Chromium Authors
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
"""Common argument parsing-related code for unexpected pass finders."""
|
|
|
|
import argparse
|
|
import logging
|
|
import os
|
|
|
|
from unexpected_passes_common import constants
|
|
|
|
|
|
def AddCommonArguments(parser: argparse.ArgumentParser) -> None:
|
|
"""Adds arguments that are common to all unexpected pass finders.
|
|
|
|
Args:
|
|
parser: An argparse.ArgumentParser instance to add arguments to.
|
|
"""
|
|
parser.add_argument('--project',
|
|
required=True,
|
|
help='The billing project to use for BigQuery queries. '
|
|
'Must have access to the ResultDB BQ tables, e.g. '
|
|
'"chrome-luci-data.chromium.gpu_ci_test_results".')
|
|
parser.add_argument('--num-samples',
|
|
type=int,
|
|
default=100,
|
|
help='The number of recent builds to query.')
|
|
parser.add_argument('--output-format',
|
|
choices=[
|
|
'html',
|
|
'print',
|
|
],
|
|
default='html',
|
|
help='How to output script results.')
|
|
parser.add_argument('--remove-stale-expectations',
|
|
action='store_true',
|
|
default=False,
|
|
help='Automatically remove any expectations that are '
|
|
'determined to be stale from the expectation file.')
|
|
parser.add_argument('--narrow-semi-stale-expectation-scope',
|
|
action='store_true',
|
|
default=False,
|
|
help='Automatically modify or split semi-stale '
|
|
'expectations so they only apply to configurations that '
|
|
'actually need them.')
|
|
parser.add_argument('-v',
|
|
'--verbose',
|
|
action='count',
|
|
default=0,
|
|
help='Increase logging verbosity, can be passed multiple '
|
|
'times.')
|
|
parser.add_argument('-q',
|
|
'--quiet',
|
|
action='store_true',
|
|
default=False,
|
|
help='Disable logging for non-errors.')
|
|
parser.add_argument('--large-query-mode',
|
|
action='store_true',
|
|
default=False,
|
|
help='Run the script in large query mode. This incurs '
|
|
'a significant performance hit, but allows the use of '
|
|
'larger sample sizes on large test suites by partially '
|
|
'working around a hard memory limit in BigQuery.')
|
|
parser.add_argument('--expectation-grace-period',
|
|
type=int,
|
|
default=7,
|
|
help=('How many days old an expectation needs to be in '
|
|
'order to be a candidate for being removed or '
|
|
'modified. This prevents newly added expectations '
|
|
'from being removed before a sufficient amount of '
|
|
'data has been generated with the expectation '
|
|
'active. Set to a negative value to disable.'))
|
|
parser.add_argument('--result-output-file',
|
|
help=('Output file to store the generated results. If '
|
|
'not specified, will use a temporary file.'))
|
|
parser.add_argument('--bug-output-file',
|
|
help=('Output file to store "Bug:"/"Fixed:" text '
|
|
'intended for use in CL descriptions. If not '
|
|
'specified, will be printed to the terminal '
|
|
'instead.'))
|
|
parser.add_argument('--jobs',
|
|
'-j',
|
|
type=int,
|
|
help=('How many parallel jobs to run. By default, runs '
|
|
'all work in parallel.'))
|
|
internal_group = parser.add_mutually_exclusive_group()
|
|
internal_group.add_argument('--include-internal-builders',
|
|
action='store_true',
|
|
dest='include_internal_builders',
|
|
default=None,
|
|
help=('Includes builders that are defined in '
|
|
'src-internal in addition to the public '
|
|
'ones. If left unset, will be '
|
|
'automatically determined by the presence '
|
|
'of src-internal.'))
|
|
internal_group.add_argument('--no-include-internal-builders',
|
|
action='store_false',
|
|
dest='include_internal_builders',
|
|
default=None,
|
|
help=('Does not include builders that are '
|
|
'defined in src-internal. If left unset, '
|
|
'will be automatically determined by the '
|
|
'presence of src-internal.'))
|
|
|
|
|
|
def PerformCommonPostParseSetup(args: argparse.Namespace) -> None:
|
|
"""Helper function to perform all common post-parse setup.
|
|
|
|
Args:
|
|
args: Parsed arguments from an argparse.ArgumentParser.
|
|
"""
|
|
SetLoggingVerbosity(args)
|
|
SetInternalBuilderInclusion(args)
|
|
|
|
|
|
def SetLoggingVerbosity(args: argparse.Namespace) -> None:
|
|
"""Sets logging verbosity based on parsed arguments.
|
|
|
|
Args:
|
|
args: Parsed arguments from an argparse.ArgumentParser.
|
|
"""
|
|
if args.quiet:
|
|
args.verbose = -1
|
|
verbosity_level = args.verbose
|
|
if verbosity_level == -1:
|
|
level = logging.ERROR
|
|
elif verbosity_level == 0:
|
|
level = logging.WARNING
|
|
elif verbosity_level == 1:
|
|
level = logging.INFO
|
|
else:
|
|
level = logging.DEBUG
|
|
logging.getLogger().setLevel(level)
|
|
|
|
|
|
def SetInternalBuilderInclusion(args: argparse.Namespace) -> None:
|
|
"""Sets internal builder inclusion based on parsed arguments.
|
|
|
|
Args:
|
|
args: Parsed arguments from an argparse.ArgumentParser.
|
|
"""
|
|
if args.include_internal_builders is not None:
|
|
return
|
|
|
|
if os.path.isdir(constants.SRC_INTERNAL_DIR):
|
|
args.include_internal_builders = True
|
|
else:
|
|
args.include_internal_builders = False
|