SERVER-98403 Lint redundant/bad CODEOWNERS rules (#31416)
GitOrigin-RevId: cc41658a1e273216772c363c49b93170d695dbe9
This commit is contained in:
87
buildscripts/validate_codeowners.py
Executable file
87
buildscripts/validate_codeowners.py
Executable file
@@ -0,0 +1,87 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Script for validating CODEOWNERS file."""
|
||||
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
from typing import Annotated
|
||||
|
||||
import typer
|
||||
|
||||
from buildscripts.download_codeowners_validator import download_validator_binary
|
||||
|
||||
|
||||
def get_validator_env() -> dict:
|
||||
"""Prepare the environment for the codeowners-validator."""
|
||||
env = os.environ.copy()
|
||||
|
||||
env.update(
|
||||
{
|
||||
"REPOSITORY_PATH": ".",
|
||||
"CHECKS": "duppatterns,syntax",
|
||||
"EXPERIMENTAL_CHECKS": "avoid-shadowing",
|
||||
"OWNER_CHECKER_REPOSITORY": "10gen/mongo",
|
||||
}
|
||||
)
|
||||
return env
|
||||
|
||||
|
||||
def run_validator(validator_path: str) -> int:
|
||||
"""Run the codeowners validation."""
|
||||
validator_path = os.path.join(os.path.expanduser(validator_path), "codeowners-validator")
|
||||
downloaded_by_current_script = False
|
||||
# If we are running in bazel, default the directory to the workspace
|
||||
workspace_dir = os.environ.get("BUILD_WORKSPACE_DIRECTORY", ".")
|
||||
if workspace_dir:
|
||||
validator_path = os.path.join(workspace_dir, validator_path)
|
||||
|
||||
if not os.path.isfile(validator_path):
|
||||
print(f"Validator not found at {validator_path}, attempting to download...")
|
||||
try:
|
||||
download_validator_binary(os.path.dirname(validator_path))
|
||||
if not os.path.isfile(validator_path):
|
||||
print(
|
||||
f"Error: Validator still not found at {validator_path} after download attempt",
|
||||
file=sys.stderr,
|
||||
)
|
||||
return 1
|
||||
downloaded_by_current_script = True
|
||||
except Exception as exc:
|
||||
print(f"Failed to download validator: {str(exc)}", file=sys.stderr)
|
||||
return 1
|
||||
|
||||
print(f"Using validator at: {validator_path}")
|
||||
env = get_validator_env()
|
||||
|
||||
try:
|
||||
result = subprocess.run(
|
||||
[validator_path], env=env, check=True, capture_output=True, text=True
|
||||
)
|
||||
if result.stdout:
|
||||
print(result.stdout)
|
||||
return 0
|
||||
except subprocess.CalledProcessError as exc:
|
||||
if exc.stdout:
|
||||
print(exc.stdout, file=sys.stderr)
|
||||
if exc.stderr:
|
||||
print(exc.stderr, file=sys.stderr)
|
||||
return exc.returncode
|
||||
except FileNotFoundError:
|
||||
print("Error: Failed to run codeowners-validator after installation", file=sys.stderr)
|
||||
return 1
|
||||
finally:
|
||||
if downloaded_by_current_script and os.path.isfile(validator_path):
|
||||
os.remove(validator_path)
|
||||
|
||||
|
||||
def main(
|
||||
validator_path: Annotated[
|
||||
str, typer.Option(help="Path to the codeowners-validator binary")
|
||||
] = "./",
|
||||
) -> int:
|
||||
"""Validate CODEOWNERS file using codeowners-validator."""
|
||||
return run_validator(validator_path=validator_path)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
typer.run(main)
|
||||
Reference in New Issue
Block a user