Source code

Revision control

Copy as Markdown

Other Tools

# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# ruff linter deprecates List, required for Python 3.8 compatibility
from typing import List, Optional # noqa UP035
from mach.decorators import Command, CommandArgument, SubCommand
@Command(
"manifest",
category="testing",
description="Manifest operations",
virtualenv_name="manifest",
)
def manifest(_command_context):
"""
All functions implemented as subcommands.
"""
@SubCommand(
"manifest",
"skip-fails",
description="Update manifests to skip failing tests",
)
@CommandArgument("try_url", nargs=1, help="Treeherder URL for try (please use quotes)")
@CommandArgument(
"-b",
"--bugzilla",
default=None,
help="Bugzilla instance [disable]",
)
@CommandArgument(
"-C",
"--clear-cache",
nargs="?",
const="all",
default=None,
help="clear cache REVISION (or all)",
)
@CommandArgument(
"-c",
"--carryover",
action="store_true",
help="Set carryover mode (only skip failures for platform matches)",
)
@CommandArgument(
"-d",
"--dry-run",
action="store_true",
help="Determine manifest changes, but do not write them",
)
@CommandArgument(
"-F",
"--use-failures",
default=None,
help="Use failures from file",
)
@CommandArgument(
"-f",
"--save-failures",
default=None,
help="Save failures to file",
)
@CommandArgument(
"-I",
"--implicit-vars",
action="store_true",
help="Use implicit variables in reftest manifests",
)
@CommandArgument(
"-i",
"--task-id",
default=None,
help="Task id to write a condition for instead of all tasks from the push",
)
@CommandArgument(
"-k",
"--known-intermittents",
action="store_true",
help="Set known intermittents mode (only skip failures known intermittents)",
)
@CommandArgument(
"-M",
"--max-failures",
type=int,
default=-1,
help="Maximum number of failures to skip (-1 == no limit)",
)
@CommandArgument("-m", "--meta-bug-id", type=int, default=None, help="Meta Bug id")
@CommandArgument(
"-n",
"--new-version",
default=None,
help="New version to use for annotations",
)
@CommandArgument(
"-N",
"--new-failures",
action="store_true",
help="Set new failures mode (only add conditions for new failures)",
)
@CommandArgument(
"-r",
"--failure-ratio",
type=float,
default=0.4,
help="Ratio of test failures/total to skip [0.4]",
)
@CommandArgument(
"-R",
"--replace-tbd",
action="store_true",
help="Replace Bug TBD in manifests by filing new bugs",
)
@CommandArgument(
"-s",
"--turbo",
action="store_true",
help="Skip all secondary failures",
)
@CommandArgument("-T", "--use-tasks", default=None, help="Use tasks from file")
@CommandArgument("-t", "--save-tasks", default=None, help="Save tasks to file")
@CommandArgument(
"-u",
"--user-agent",
default=None,
help="User-Agent to use for mozci if queries are forbidden from treeherder",
)
@CommandArgument("-v", "--verbose", action="store_true", help="Verbose mode")
def skipfails(
command_context,
try_url,
bugzilla: Optional[str] = None,
meta_bug_id: Optional[int] = None,
turbo: bool = False,
save_tasks: Optional[str] = None,
use_tasks: Optional[str] = None,
save_failures: Optional[str] = None,
use_failures: Optional[str] = None,
max_failures: int = -1,
verbose: bool = False,
dry_run: bool = False,
implicit_vars: bool = False,
new_version: Optional[str] = None,
task_id: Optional[str] = None,
user_agent: Optional[str] = None,
failure_ratio: float = 0.4,
clear_cache: Optional[str] = None,
carryover: bool = False,
known_intermittents: bool = False,
new_failures: bool = False,
replace_tbd: bool = False,
):
from skipfails import Skipfails, SkipfailsMode
mode: int = SkipfailsMode.from_flags(
carryover,
known_intermittents,
new_failures,
replace_tbd,
)
Skipfails(
command_context,
try_url,
verbose,
bugzilla,
dry_run,
turbo,
implicit_vars,
new_version,
task_id,
user_agent,
clear_cache,
).run(
meta_bug_id,
save_tasks,
use_tasks,
save_failures,
use_failures,
max_failures,
failure_ratio,
mode,
)
@SubCommand(
"manifest",
"high-freq-skip-fails",
description="Update manifests to skip failing tests",
)
@CommandArgument(
"-f",
"--failures",
default="30",
dest="failures",
help="Minimum number of failures for the bug to be skipped",
)
@CommandArgument(
"-d",
"--days",
default="7",
dest="days",
help="Number of days to look for failures since now",
)
def high_freq_skipfails(command_context, failures: str, days: str):
from high_freq_skipfails import HighFreqSkipfails
try:
failures_num = int(failures)
except ValueError:
failures_num = 30
try:
days_num = int(days)
except ValueError:
days_num = 7
HighFreqSkipfails(command_context, failures_num, days_num).run()
@SubCommand(
"manifest",
"clean-skip-fails",
description="Update manifests to remove skip-if conditions for a specific platform. Only works for TOML manifests.",
)
@CommandArgument(
"manifest_search_path",
nargs=1,
help="Path to the folder containing the manifests to update, or the path to a single manifest",
)
@CommandArgument(
"-o",
"--os",
default=None,
dest="os_name",
help="OS to remove (linux, mac, win)",
)
@CommandArgument(
"-s",
"--os_version",
default=None,
dest="os_version",
help="Version of the OS to remove (eg: 18.04 for linux)",
)
@CommandArgument(
"-p",
"--processor",
default=None,
dest="processor",
help="Type of processor architecture to remove (eg: x86)",
)
def clean_skipfails(
command_context,
manifest_search_path: List[str], # noqa UP006
os_name: Optional[str] = None,
os_version: Optional[str] = None,
processor: Optional[str] = None,
):
from clean_skipfails import CleanSkipfails
CleanSkipfails(
command_context, manifest_search_path[0], os_name, os_version, processor
).run()