| # Licensed under the Apache-2.0 license | |
| # SPDX-License-Identifier: Apache-2.0 | |
| """Runs the local presubmit checks for the repository.""" | |
| import argparse | |
| import logging | |
| import os | |
| import re | |
| import sys | |
| from typing import Pattern | |
| from pw_cli import log | |
| from pw_presubmit import ( | |
| cli, | |
| json_check, | |
| keep_sorted, | |
| ) | |
| from presubmit import cpp_include_guard, license | |
| from pw_presubmit.install_hook import install_git_hook | |
| from pw_presubmit.presubmit import Programs | |
| _LOG = logging.getLogger("presubmit") | |
| # Paths to completely exclude from presubmit checks. | |
| _EXCLUDE_PATHS = ("\\bthird_party/.*\\.json$",) | |
| EXCLUDES = tuple(re.compile(path) for path in _EXCLUDE_PATHS) | |
| # Quick lint and format checks. | |
| QUICK = ( | |
| cpp_include_guard.include_guard_check, | |
| license.license_check, | |
| json_check.presubmit_check, | |
| # TODO(cfrantz): Determine how to enable the fix option for keep_sorted. | |
| # keep_sorted.presubmit_check, | |
| ) | |
| def parse_args() -> dict: | |
| """Creates an argument parser and parses arguments.""" | |
| parser = argparse.ArgumentParser(description=__doc__) | |
| cli.add_arguments(parser, Programs(quick=QUICK), "quick") | |
| parser.add_argument( | |
| "--install", | |
| action="store_true", | |
| help="Install the presubmit as a Git pre-push hook and exit.", | |
| ) | |
| return vars(parser.parse_args()) | |
| def run(install: bool, exclude: list[Pattern[str]], **presubmit_args) -> int: | |
| """Entry point for presubmit.""" | |
| if install: | |
| install_git_hook( | |
| "pre-push", | |
| ["./pw", "presubmit"], | |
| ) | |
| return 0 | |
| exclude.extend(EXCLUDES) | |
| return cli.run(exclude=exclude, **presubmit_args) | |
| def main() -> int: | |
| """Run the presubmit for the repository.""" | |
| # Change to working directory if running from Bazel. | |
| if "BUILD_WORKING_DIRECTORY" in os.environ: | |
| os.chdir(os.environ["BUILD_WORKING_DIRECTORY"]) | |
| return run(**parse_args()) | |
| if __name__ == "__main__": | |
| log.install(logging.INFO) | |
| sys.exit(main()) |