salt/tools/precommit/filemap.py
Pedro Algarvio eeaa88b4e9 Migrated tasks/filemap.py -> tools/precommit/filemap.py
Refs #64374

Signed-off-by: Pedro Algarvio <palgarvio@vmware.com>
2023-11-23 08:44:35 +00:00

91 lines
2.9 KiB
Python

"""
`tests/filename_map.yml` validity checks
"""
import pathlib
import re
import yaml
from ptscripts import Context, command_group
import tools.utils
FILENAME_MAP_PATH = tools.utils.REPO_ROOT / "tests" / "filename_map.yml"
cgroup = command_group(name="filemap", help=__doc__, parent="pre-commit")
def _match_to_test_file(match: str) -> pathlib.Path:
tests_path = tools.utils.REPO_ROOT / "tests"
parts = match.split(".")
parts[-1] += ".py"
return tests_path.joinpath(*parts).relative_to(tools.utils.REPO_ROOT)
def _check_matches(ctx: Context, rule: str, matches: list[str]) -> int:
errors = 0
for match in matches:
filematch = _match_to_test_file(match)
if not filematch.exists():
ctx.error(
f"The match '{match}' for rule '{rule}' points to a non "
f"existing test module path: {filematch}"
)
errors += 1
return errors
@cgroup.command(
name="check",
)
def check(ctx: Context) -> None:
exitcode = 0
excludes = ("tools/", "templates/", ".nox/")
full_filelist = [
path.relative_to(tools.utils.REPO_ROOT)
for path in tools.utils.REPO_ROOT.rglob("*.py")
]
filelist = [
str(path) for path in full_filelist if not str(path).startswith(excludes)
]
filename_map = yaml.safe_load(FILENAME_MAP_PATH.read_text())
for rule, matches in filename_map.items():
if rule == "*":
exitcode += _check_matches(ctx, rule, matches)
elif "|" in rule:
# This is regex
for filepath in filelist:
if re.match(rule, filepath):
# Found at least one match, stop looking
break
else:
ctx.error(
f"Could not find a matching file in the salt repo for the rule '{rule}'"
)
exitcode += 1
continue
exitcode += _check_matches(ctx, rule, matches)
elif "*" in rule or "\\" in rule:
# Glob matching
process_matches = True
for filerule in tools.utils.REPO_ROOT.glob(rule):
if not filerule.exists():
ctx.error(
f"The rule '{rule}' points to a non existing path: {filerule}"
)
exitcode += 1
process_matches = False
if process_matches:
exitcode += _check_matches(ctx, rule, matches)
else:
# Direct file paths as rules
filerule = pathlib.Path(rule)
if not filerule.exists():
ctx.error(
f"The rule '{rule}' points to a non existing path: {filerule}"
)
exitcode += 1
continue
exitcode += _check_matches(ctx, rule, matches)
if exitcode:
ctx.error(f"Found {exitcode} errors")
ctx.exit(exitcode)