blob: 86a2bc634a82c74a5172529ce0968f3867030aaf [file] [log] [blame]
# 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.')
semi_stale_group = parser.add_mutually_exclusive_group()
semi_stale_group.add_argument(
'--modify-semi-stale-expectations',
action='store_true',
default=False,
help='If any semi-stale expectations are found, '
'prompt the user about the modification of '
'each one.')
semi_stale_group.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